使用PDO更新数据为什么它不起作用

时间:2012-06-20 07:46:42

标签: php mysql sql pdo

<?php
$sTable = "mytable";    

$colUpdate = $_GET['field'];// database field name
$valUpdate = $_GET['val']; // the long string ,can be non-English   
$rowID = $_GET['id']; //number

    $pdo = PDO2::getInstance();
    $pdo->exec('SET NAMES utf8'); // for utf-8

    $sql = "UPDATE $sTable
            SET $colUpdate =:valUpdate
            WHERE id =:rowID ";      
    $req = $pdo->prepare($sql);
    $req->bindValue(":valUpdate",  $valUpdate);
    $req->bindValue(":rowID",  $rowID);

    $req->execute();
    $req->closeCursor();        
   ?>

我在这里错了什么?因为如果我这样做的话它会起作用:

 <?php
    $sTable = "mytable";
    $pdo = PDO2::getInstance();
    $colUpdate = $_GET['field'];
    $valUpdate = $_GET['val'];      
    $rowID = $_GET['id'];

    $sQuery = " UPDATE $sTable SET  $colUpdate = '$valUpdate' WHERE  id = $rowID";
    $req = $pdo->prepare($sQuery);
    $req->execute();
    $req->closeCursor();    
?>

1 个答案:

答案 0 :(得分:3)

您的代码中存在以下几个问题:

  1. 您使用的是Singleton
  2. 您没有检查错误
  3. 您直接传递GET变量。
  4. 让我们解决每一个问题,是吗?

    1。您正在使用Singleton

    Singletons are evil ,它们设置在全局空间中,这会使您的应用程序不稳定,不可靠且不可测试。此外,如果您需要另一个数据库连接,您会怎么做?

    解决方案

    使用新的PDO实例。

    2。您没有检查错误

    您的代码中没有任何错误检查,因此如果出现错误,则会被忽略。

    解决方案

    在PDO的构造函数中将PDO::ATTR_ERRMODE设置为PDO::ERRMODE_EXCEPTION或使用setAttribute。它还有助于将PDO::EMULATE_PREPARES设置为false

    3。您将GET变量直接传递给查询

    您正在查询中直接传递$colUpdate,即使您正在准备语句,也不会转义直接传递到查询字符串中的变量。

    解决方案

    将其传递给占位符,然后绑定该值。此外,如果您需要用户输入来确定您正在更新的,那么您的结构很可能存在缺陷。

    在所有这些之后,我来到以下代码:

    <?php
    /*
     * Variable Initialization
     */
    /** @var $table_name string Name of the table to insert */
    $table_name = "mytable";
    
    /**
     * @var $field_to_update string Name of field to update
     * @deprecated Should not be used! Database restructuring needed!
     */
    $field_to_update = mysql_real_escape_string($_GET['field']); //At least escape it!
    
    /** @var $value_to_insert string */
    $value_to_insert = $_GET['val'];
    
    /** @var $row_id integer */
    $row_id = $_GET['id'];
    
    $pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $pdo->exec('SET NAMES utf8'); // for utf-8
    
    $sql = <<<MySQL
    UPDATE $table_name
        SET $field_to_update = :valUpdate
        WHERE id = :rowID
    MySQL;
    
    $req = $pdo->prepare($sql);
    $req->bindValue(":valUpdate", $value_to_insert, PDO::PARAM_STR);
    $req->bindValue(":rowID", $row_id, PDO::PARAM_INT);
    
    $req->execute();