update1:我尝试了所有的建议(非常感谢btw),但执行仍然没有经历显示"更新了0行"。我已经尝试了多种方法来解决这个问题但似乎对我没有任何帮助。
这是我目前的代码:
if(isset($_POST['Done'])) {
$updateCD = "UPDATE users SET lgs=?, its=?, hbs=?, bios=?, pls=?, cts=? WHERE email=?";
$stmt = $con->prepare($updateCD);
$stmt->bind_param('sssssss', $_POST['lgs'], $_POST['its'], $_POST['hbs'], $_POST['bios'], $_POST['pls'], $_POST['cts'], $_GET['email']);
$stmt->execute();
if ($stmt->errno) {
echo "FAILURE!!! " . $stmt->error;
}
else {
echo "Updated {$stmt->affected_rows} rows";
$stmt->close();
}
}
我希望通过用预准备语句替换我的基本sqli查询来提高代码的安全性。
此UPDATE语句涉及更新数据库中用户的配置文件信息。问题是,尽管我遵循的模型,更新执行没有通过,因此在数据库中没有任何改变。
PHP代码:
$email_login = mysqli_real_escape_string($con, $GET['email']);
$lg = mysqli_real_escape_string($con, $_POST['lgs']);
$it = mysqli_real_escape_string($con, $_POST['its']);
$hb = mysqli_real_escape_string($con, $_POST['hbs']);
$bio = mysqli_real_escape_string($con, $_POST['bios']);
$pl = mysqli_real_escape_string($con, $_POST['pls']);
$ct = mysqli_real_escape_string($con, $_POST['cts']);
if(isset($_POST['Done'])) {
$updateCD = "UPDATE users SET lgs=?, its=?, hbs=?, bios=?, pls=?, cts=? WHERE email=?";
$stmt = $con->prepare($updateCD);
$stmt->bind_param('sssssss', $lg, $it, $hb, $bio, $pl, $ct, $email_login);
$stmt->execute();
if ($stmt->errno) {
echo "FAILURE!!! " . $stmt->error;
}
else {
echo "Updated {$stmt->affected_rows} rows";
$stmt->close();
}
}
关闭后的注意事项:我理解为什么看起来好像这个问题与另一个问题相似,但绝不是完全重复。引用的问题涉及一般更新表,而这个问题放大了使用预准备语句来执行更新。我已经知道如何在不使用预准备语句的情况下更新表,因此我希望使用更可靠的框架集来改进我的代码语法。虽然这两个问题都是相关的,但它们的范围不同。
答案 0 :(得分:1)
您的$email_login
变量为空;即使它是通过GET获得的,您也必须使用$_GET
,而不是$GET
。
如各种评论中所述,不要使用mysqli_real_escape_string
,因为可靠的转义是由MySQLi本身完成的。只需将$_POST
变量直接作为bind_param
的参数传递。
其他一些想法: