3

我正在将 MySQLi 用于一个项目(但可以轻松切换到 PDO,请阅读底部的编辑)。我想要的是能够将关联数组处理成 mysql 查询,而无需手动键入每个键/值对。我知道这可能很简单,但是当涉及到 MySQLi/PDO 时,我仍然处于学习过程中。为了清楚我的意思是一个例子:

假设我有这个关联数组:

$data = array(
    'name' => 'Objective',
    'short_name' => 'OB',
    'generation' => 1
);

我想要的是创建一个这样的查询:

UPDATE signals SET ? = ? WHERE sid = '1'

它变成这样的查询(或者代替 UPDATE、INSERT、SELECT 等):

UPDATE signals SET
    name = 'Objective', 
    short_name = 'OB', 
    generation = 1 
WHERE sid = '1'

所以基本上我的问题是:这可能与 MySQLi 或 PDO 本身有关吗?如果可能的话,我该怎么做?我已经阅读了在执行之前准备语句的内容,但它还没有让我明白。希望有人可以帮助我。

编辑:我仍然很早就进入该项目,所以我也可以使用 PDO,但同样的问题仍然存在。我确实研究了 PDO 和 mysqli,但我也不知道如何用 PDO 来做。因此,为了这个问题,我将 PDO 作为标签添加到问题中。

4

4 回答 4

4

这是一个函数,它将接受一个输入数组并产生一些你可以直接放入查询中的东西,只要你只更新一个表:

function array_to_pdo_params($array) {
  $temp = array();
  foreach (array_keys($array) as $name) {
    $temp[] = "`$name` = ?";
  }
  return implode(', ', $temp);
}

现在您可以像这样执行您的 PDO 查询:

// The data
$data = array(
  'name' => 'Objective',
  'short_name' => 'OB',
  'generation' => 1
);

// The parameter for the WHERE clause
$sid = 1;

// Build the query string
$query = "
  UPDATE `signals`
  SET ".array_to_pdo_params($data)."
  WHERE `sid` = ?
";

// Convert the data array to indexed and append the WHERE parameter(s) to it
$queryData = array_values($data);
$queryData[] = $sid;

$stmt = $db->prepare($query); // Obviously add the appropriate error handling

$stmt->execute($queryData);
于 2012-07-30T12:15:26.210 回答
2

您可以通过传递一组输入值来使用 PDO 的执行语句,以进行准备好的查询。供参考: http: //php.net/manual/en/pdostatement.execute.php

例子:

<?php
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
?>
于 2012-07-30T11:41:36.923 回答
0

Zend_DB 会让你做到这一点。

尽管我们为我的工作创建了一个包装器以使其更简单,但我真的认为它就像你能得到的一样简单,它为你做了所有神奇的事情。

你真的应该试一试;学习后可以节省大量时间。

于 2012-07-30T11:30:34.703 回答
0

如何构建查询http_build_query如下:

$columns = array(
  'name',
  'short_name',
  'generation', ...
);

$data = array(
  'name' => 'Objective',
  'short_name' => 'OB',
  'generation' => 1
);

$to_update = array_intersect_key($data, array_flip($columns));
$update_string = urldecode(http_build_query(array_combine(array_keys($columns), array_fill(0, count($columns), '?')), '', ', '));

try {
 $stmt = $db->prepare(sprintf('UPDATE table SET %s WHERE condition=?', $update_string));
 $result = $stmt->execute(array_values($data));

 ...

} catch (\PDOException $ex) { 

}

确保在数组WHERE末尾有条件参数。$data

于 2012-07-30T11:47:32.463 回答