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のexecuteステートメントを使用できます。参考: 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 に答える