我是PHP和PDO的新手。我有一个关于PDO和单引号转义的非常基本的问题。我认为逃避不是必要的,但我仍然遇到了一些问题。
例如......我的数据库类中的以下方法在数据库中创建一个新对象。它是抽象的,我的所有类都扩展了数据库类。
public function create() {
$attributes = $this->attributes();
$question_marks = array();
foreach ($attributes as $key => $value) {
$question_marks[] = "?";
}
$place_holder = array_intersect_key($attributes, get_object_vars($this));
$place_holder = array_values($place_holder);
$sql = "INSERT INTO ".static::$table_name." (";
$sql .= join(", ", array_keys($attributes));
$sql .= ") VALUES (";
$sql .= join(", ", array_values($question_marks));
$sql .= ")";
$query = $handler->prepare($sql);
$query->execute($place_holder);
}
如果我创建说例如新用户。我可以毫不费力地将James O' Reilly这个名字输入数据库......
但是当我想使用我的更新方法....
public function update() {
$attributes = $this->attributes();
print_r($attributes);
$attribute_pairs = array();
foreach($attributes as $key => $value) {
if(isset($value))
$attribute_pairs[] = "{$key}='{$value}'";
}
$sql = "UPDATE ".static::$table_name." SET ";
$sql .= join(", ", $attribute_pairs);
$sql .= " WHERE id=". $this->id;
$query = $handler->prepare($sql);
$query->execute(array());
}
失败了。如果我手动从数据库中的名称中删除引号,则此Update方法可以正常工作,因此我希望将此引号转义为问题。
在使用PDO时是否完全不必使用单引号,如果是这样,我将错误设置为如上所示的更新方法。
为了解决这些问题,我似乎无法将我的错误输出正常工作......这是我的设置,通过在这里审查优秀的Wiki,我认为是正确的...但当然感觉免于火焰。
$opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC);
$handler = new PDO('mysql:host=localhost;dbname=lung', 'root', 'fidelio', $opt);
答案 0 :(得分:5)
仅使用prepare()
不会自动引用所有变量。所有prepare()
看到的都是一个字符串,在之后插入了变量。它没有办法告诉字符串的哪个部分来自变量,哪个部分来自代码中的文字字符串。
您必须为所有值使用参数,而不是将它们插入到字符串中。
public function update() {
$attributes = $this->attributes();
print_r($attributes);
$attribute_pairs = array();
$attribute_values = array();
foreach($attributes as $key => $value) {
if(isset($value)) {
$attribute_pairs[] = "`{$key}`=?"; // use parameter placeholders
$attribute_values[] = $value; // collect the corresponding values
}
}
$sql = "UPDATE `".static::$table_name."` SET ";
$sql .= join(", ", $attribute_pairs);
$sql .= " WHERE id=?"; // use a placeholder here too
$attribute_values[] = $this->id; // and add to the collected values
$query = $handler->prepare($sql);
$query->execute($attribute_values); // pass the values here
}
注意我还将您的表名和列名放在后面,以便在SQL标识符中使用保留字或特殊字符时帮助分隔它们。