<?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();
?>
答案 0 :(得分:3)
您的代码中存在以下几个问题:
让我们解决每一个问题,是吗?
Singletons are evil ,它们设置在全局空间中,这会使您的应用程序不稳定,不可靠且不可测试。此外,如果您需要另一个数据库连接,您会怎么做?
使用新的PDO实例。
您的代码中没有任何错误检查,因此如果出现错误,则会被忽略。
在PDO的构造函数中将PDO::ATTR_ERRMODE
设置为PDO::ERRMODE_EXCEPTION
或使用setAttribute
。它还有助于将PDO::EMULATE_PREPARES
设置为false
。
您正在查询中直接传递$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();