PHP变量不';t使用MySQL更新查询加载

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,

我省略了不必要的代码。每当我试着运行它时,它都会毫无错误地运行。但是,在更新查询中,每当我使用WHERE student_id='$student_id',它都不会更新。没有错误,只是不更新。但是,当我使用变量的数值等价物(如1)时,它工作得很好。我错过了什么?谢谢大家!

$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变量。