PHP变量不会加载MySQL更新查询

时间:2013-10-15 00:00:15

标签: php mysql pdo

我省略了不必要的代码。每当我尝试运行它时,它都会没有任何错误地处理。但是,在更新查询中,每当我使用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");
  }
}

3 个答案:

答案 0 :(得分:1)

你怎么在这里同时使用get和post方法?

我想这是:$resolved_student_id = $_GET['student_id'];

应替换为:$resolved_student_id = $_POST['student_id'];

如果您需要这两种方法,请确保在表单URL中指定GET数据。

eg:<form method="POST" action="abc.php?student_id=1">

它没有更新$student_id的原因你没有定义任何这样的变量,至少我在你发布的代码中可以看到这一点。

答案 1 :(得分:0)

您已将查询编写为直接查询(其中定义了所有选项),但您正在运行prepare,其查询将如下所示

UPDATE students SET student_name=?, tutor=?, intervention=? WHERE student_id=?

然后,您将运行bind_param将数据绑定到预准备语句,然后execute()

因此,要么将查询转换为预准备语句查询并绑定参数,要么从prepare更改为query

答案 2 :(得分:0)

这里有几件事......

  1. 配置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));
    
  2. 停止捕获异常并将其丢弃。这在发展过程中是最重要的。一旦您确信代码正常运行,就可以实现高级异常处理方案。只需从代码中删除try控件和catch

  3. 即可
  4. 使用参数绑定查询而不是字符串插值。这将使您的查询对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
    

    您对更新查询也会这样做。