PHP变量不';t使用MySQL更新查询加载
我省略了不必要的代码。每当我试着运行它时,它都会毫无错误地运行。但是,在更新查询中,每当我使用WHERE student_id='$student_id',它都不会更新。没有错误,只是不更新。但是,当我使用变量的数值等价物(如1)时,它工作得很好。我错过了什么?谢谢大家!PHP变量不';t使用MySQL更新查询加载,php,mysql,pdo,Php,Mysql,Pdo,我省略了不必要的代码。每当我试着运行它时,它都会毫无错误地运行。但是,在更新查询中,每当我使用WHERE student_id='$student_id',它都不会更新。没有错误,只是不更新。但是,当我使用变量的数值等价物(如1)时,它工作得很好。我错过了什么?谢谢大家! $resolved_student_id = $_GET['student_id']; try { $request_sd = $db -> prepare("SELECT student_name,tutor,
$resolved_student_id = $_GET['student_id'];
try {
$request_sd = $db -> prepare("SELECT student_name,tutor,intervention FROM students WHERE student_id='$resolved_student_id'");
$request_sd -> execute();
} catch ( Exception $e ) {
echo "Could not query database.";
exit;
}
$studentdata = $request_sd -> fetch();
if ( empty( $_POST ) === false ) {
if ( empty( $_POST['student_name'] ) === true || empty( $_POST['student_tutor'] ) === true || empty( $_POST['student_intervention'] ) === true ) {
$updateStudentInformation = "You need to fill out all fields.";
} else {
$student_name = $_POST['student_name'];
$student_tutor = $_POST['student_tutor'];
$student_intervention = $_POST['student_intervention'];
try {
$updatedata = $db -> prepare("UPDATE students SET student_name='$student_name', tutor='$student_tutor', intervention='$student_intervention' WHERE student_id='$resolved_student_id'");
$updatedata -> execute();
} catch (Exception $e) {
echo "Could not update database.";
exit;
}
header("location: edit.php");
}
}
您已经将查询编写为一个直接查询(其中定义了所有选项),但是您正在运行
prepare
,您的查询如下所示
UPDATE students SET student_name=?, tutor=?, intervention=? WHERE student_id=?
然后运行将数据绑定到准备好的语句,然后执行()
因此,要么将查询转换为预处理语句查询并绑定参数,要么将查询从
prepare
更改为query
为什么在这里同时使用get和post方法
我猜:$resolved\u student\u id=$\u GET['student\u id'代码>
应替换为:$resolved\u student\u id=$\u POST['student\u id']代码>
如果需要这两种方法,请确保在表单URL中指定GET数据
eg:<form method="POST" action="abc.php?student_id=1">
例如:
它没有更新where$student\u id
的原因是你没有定义任何这样的变量,至少我在你发布的代码中没有看到这些变量。这里有几件事
配置PDO以引发异常。我喜欢使用这个构造函数来优化MySQL的使用
$db = new PDO('mysql:host=localhost;dbname=db_name;charset=utf8', 'username', 'password', array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
停止捕获异常并丢弃它们。这在发展中是最重要的。一旦您确信代码运行正常,就可以实现高级异常处理方案。只需从代码中删除try
控件和catch
块
对查询使用参数绑定,而不是字符串插值。这将使您的查询对SQL注入攻击更具弹性
$request_sd = $db->prepare("SELECT student_name,tutor,intervention FROM students WHERE student_id = ?");
$request_sd->execute([$resolved_student_id]);
// use array($resolved_student_id) if using an older version of PHP
您可以对更新查询执行相同的操作
这在吗?事实上,它在PDO中。如果您正在准备,请使用参数而不是未转换的字符串。另外,您是否已将(PDO?)数据库配置为引发异常?另外$resolved\u student\u id
!=<代码>$student\u id
,这可能是原因吗?@user2672698不,不要这样做。坚持使用准备好的语句,但使用参数binding1)PDO,而不是MySQLi。2) 当然,我们建议您使用参数绑定,但您不必为了使用prepare
而使用参数绑定。您帮助我认识到我在这里做错了什么,非常感谢。它现在正在工作。我对同一页面使用了表单操作请求,但没有包含正确处理表单所需的GET变量。