-1
<?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();    
?>
4

1 回答 1

3

您的代码中有几个问题:

  1. 您正在使用单例
  2. 你没有检查错误
  3. 您直接传递 GET 变量。

让我们解决每个问题,好吗?

1.您使用的是单例

单例是邪恶的,它们被设置在全局空间中,这使您的应用程序不稳定、不可靠和不可测试。此外,如果您需要另一个数据库连接,您会怎么做?

解决方案

使用新的 PDO 实例。

2. 你没有检查错误

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

解决方案

在 PDO 的构造函数中设置PDO::ATTR_ERRMODE为或使用. 它还有助于设置为.PDO::ERRMODE_EXCEPTIONsetAttributePDO::EMULATE_PREPARESfalse

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();
于 2012-06-20T09:16:16.777 回答