PDO更新语法困难

时间:2014-12-28 00:47:09

标签: mysql pdo

我有一个包含表'comments'的数据库。它包含由id编号的照片,喜欢和不喜欢的数量以及作为喜欢和不喜欢之间的差异的某种照片等级的“pr”。 我回应了PR,看起来它被正确计算了。 PDO存在一些问题。我想将它添加到数据库,没有任何反应,没有错误等 我做错了什么?

<?php
$pdo = new PDO('mysql:host=localhost;dbname=databasename;encoding=utf8', 'login', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$stmt = $pdo -> query('SELECT * FROM photos');
while($all = $stmt ->fetch()){
$id = $all['id'];
$likes = $all['likes'];
$dislikes = $all['dislikes'];
$pr = $likes - $dislikes;

$stmt = $pdo -> prepare ("UPDATE photos SET ('pr' = :pr) WHERE 'id' = '".$id."' ");
}


?>

编辑我的第一次尝试:

$stmt = $pdo -> prepare ("UPDATE photos SET `pr` = :pr WHERE `id` = :id ");

2 个答案:

答案 0 :(得分:0)

不要在作业周围加上括号。如果你需要转义列名,你可以使用反引号,而不是单引号。

UPDATE photos SET `pr` = :pr WHERE `id` = :id

您还应该使用占位符作为ID,不要连接$id

然后您需要绑定参数:

$stmt->bindParam(':id', $id);
$stmt->bindParam(':pr', $pr);

另一个问题是,您对第一个查询的结果和第二个查询的预准备语句使用相同的变量$stmt

整个重写代码如下:

$res = $pdo->query('SELECT id, likes, dislikes FROM photos');
$stmt = $pdo->prepare("UPDATE photos SET `pr` = :pr WHERE `id` = :id ");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':pr', $pr);
while ($all = $res->fetch(PDO::FETCH_ASSOC)) {
    $id = $all['id'];
    $pr = $all['likes'] - $all['dislikes'];
    $stmt->execute();
}

但是也不需要对SELECTUPDATE使用单独的查询,您可以一次完成所有操作:

$pdo->query("UPDATE photos SET pr = likes - dislikes");

答案 1 :(得分:0)

这实际上是巴马尔答案的附录,有一个更完整的例子。就我必须添加的内容而言,应该注意的是,必须先从语句中获取所有结果(或调用PDOStatmement::closeCursor),然后才能执行另一个。这是在每个连接(PDO)实例上。这样做你的代码需要看起来像:

$pdo = new PDO('mysql:host=localhost;dbname=databasename;encoding=utf8', 'login', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo -> query('SELECT * FROM photos');
$updateData = array();

while($row = $stmt->fetch()){
  // for each row of the result
  // create an entry in the $updateData array
  // we will make this entry conform to the format
  // expected by PDOStatement::execute ie.
  // array(placeholder => value )
  $updateData[] = array( 
    ':id' => $row['id'],
    ':pr' => $row['likes'] - $row['dislikes']
  );
}

// prepare the update statement
$updateStmt = $pdo->prepare('UPDATE photos SET pr = :pr WHERE id = :id');

foreach ($updateData as $params) {
  // loop over $updateData and execute the statement for each row
  // if you have placeholders you need to pass in the params
  // when executing the statement
  $updateStmt->execute($params);
}

现在说没有必要这样做,因为你可以在查询中完成所有操作,如@Barmar所建议的那样:

$pdo = new PDO('mysql:host=localhost;dbname=databasename;encoding=utf8', 'login', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// query prepares and executes the statement all in one go
$stmt = $pdo->query('UPDATE photos p SET p.pr = p.likes - p.dislikes');