PHP中SQL查询中的多个参数
Posted
技术标签:
【中文标题】PHP中SQL查询中的多个参数【英文标题】:Multiple parameters in SQL query in PHP 【发布时间】:2017-03-15 01:19:20 【问题描述】:我正在尝试使用以下代码使用 userid 参数编辑数据库中的一行。
但是使用代码我得到了这个错误:
您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在 'SET firstname = IF(? '', ?, firstname), SET surname = IF(? 附近使用正确的语法
我真的不确定问题出在哪里,因为 SQL 查询中的所有内容都按顺序排列。我试过取出 IF(? '', ?, ) 但它仍然给出错误。我已经仔细检查了表中的所有列名是否正确。我究竟做错了什么?
<?php
include 'database_conn.php';
if(!$conn)
echo "Error connecting to database";
if (mysqli_connect_errno())
echo "<p>Connection failed:".mysqli_connect_error()."</p>\n";
$id = isset($_GET['userId']) ? $_GET['userId'] : NULL;
$newUsername = isset($_REQUEST['updateUsername']) ? $_REQUEST['updateUsername'] : NULL;
$newEmail = isset($_REQUEST['updateEmail']) ? $_REQUEST['updateEmail'] : NULL;
$newPassword = isset($_REQUEST['updatePassword']) ? $_REQUEST['updatePassword'] : NULL;
$newForename = isset($_REQUEST['updateForename']) ? $_REQUEST['updateForename'] : NULL;
$newSurname = isset($_REQUEST['updateSurname']) ? $_REQUEST['updateSurname'] : NULL;
$newDob = isset($_REQUEST['updateDob']) ? $_REQUEST['updateDob'] : NULL;
$sql = "UPDATE Users
SET username = IF(? <> '', ?, username),
SET firstname = IF(? <> '', ?, firstname),
SET surname = IF(? <> '', ?, surname),
SET email = IF(? <> '', ?, email),
SET password = IF(? <> '', ?, password),
SET dateofbirth = IF(? <> '', ?, dateofbirth)
WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql)
or die(mysqli_error($conn));
mysqli_stmt_bind_param($stmt, "ssssssi", $newUsername, $newForename, $newSurname, $newEmail,
$newPassword, $newDob, $id)
or die(mysqli_error($conn));
mysqli_stmt_execute($stmt)
or die(mysqli_error($conn));
if($stmt)
echo "Details updated successfully";
else
die(mysqli_error($conn));
mysqli_close($conn);
?>
【问题讨论】:
你到底想用那个 SQL 语法做什么?IF(? <> '', ?, username)
到处都是。您是否只是想将用户名设置为等于$_REQUEST['updateUsername'])
?我强烈建议检查this existing answer。
这不是 UPDATE 的工作方式。 RTMdev.mysql.com/doc/refman/5.7/en/update.html
另外,我希望你不要忍受这个;存储纯文本密码。
我在另一个堆栈溢出线程上发现了它,并不确定它在做什么。如果表单中没有输入值,我要做的就是不要用空白字符串覆盖行中的值。不,弗雷德,它不会上线。
我想知道它的链接,因为语法错误。最好在回复@Ajek 时像我在这里所做的那样给我打电话。我并不总是在场。
【参考方案1】:
MySQL 的“UPDATE”仅使用 一个 SET
以逗号分隔:
您的查询应为:
$query = "
UPDATE `users`
SET
`username` = IF(? <> '', ?, `username`),
`firstname` = IF(? <> '', ?, `firstname`),
`surname` = IF(? <> '', ?, `surname`),
`email` = IF(? <> '', ?, `email`),
`password` = IF(? <> '', ?, `password`),
`dateofbirth` = IF(? <> '', ?, `dateofbirth`)
WHERE `id` = ?
";
看到您基于以下问答,已经更改了它的语法:
Stop sql from updating blank or empty fields from my update form根据你留给我的链接in the comments area。
您在 cmets 中说这不是一个实时站点。但是,如果您确实决定使用此功能,请使用 password_hash()
和 password_verify()
。
参考资料:
http://php.net/manual/en/function.password-hash.php http://php.net/manual/en/function.password-verify.php因为存储纯文本密码很危险。
注意:密码列的长度必须为 60+。手册建议 255 是一个不错的选择。
【讨论】:
以上是关于PHP中SQL查询中的多个参数的主要内容,如果未能解决你的问题,请参考以下文章
多个 <select> 下拉列表作为 sql 参数 | PHP