mysql_*()
ext / mysql(関数)を使用したコードの一部をPDOとプリペアドステートメントに変換しています。以前は、クエリを動的に作成していたときに、文字列を渡してクエリにmysql_real_escape_string()
直接ドロップしていましたが、クエリを実行するときに値を配列として渡すか、実行前に変数をバインドする必要があります。
古いコードを新しいデータベースドライバーを使用するように変換するにはどうすればよいですか?
クエリをext/mysqlからPDOプリペアドステートメントに移行するには、いくつかの側面への新しいアプローチが必要です。ここでは、定期的に実行する必要があるいくつかの一般的なタスクについて説明します。これは、考えられるすべての状況に完全に一致するわけではなく、クエリを動的に生成するときに使用できるいくつかの手法を示すことを目的としています。
始める前に、覚えておくべきことがいくつかあります。何かが正しく機能しない場合は、質問する前にこのリストを確認してください。
mysql_real_escape_string()
。完全な説明については、これを参照してください。$_POST
し$_GET
て$_COOKIE
列名を指定しないでください。動的クエリを作成するために使用する前に、このデータを前処理する必要があります。:name
。実行のためにデータを渡す場合、対応する配列キーにはオプションで先頭:
を含めることができますが、必須ではありません。プレースホルダー名には、英数字のみを含める必要があります。以下のすべてのサンプルコードは、データベース接続が確立されており、関連するPDOインスタンスが変数に格納されていることを前提としています$db
。
これを行う最も簡単な方法は、名前付きプレースホルダーを使用することです。
ext / mysqlを使用すると、クエリが作成されたときに値をエスケープし、エスケープされた値をクエリに直接配置します。PDOプリペアドステートメントを作成するときは、代わりに配列キーを使用してプレースホルダー名を指定するため、配列をに直接渡すことができPDOStatement::execute()
ます。
この例では、3つのキーと値のペアの配列があります。ここで、キーは列名を表し、値は列の値を表します。いずれかの列が一致するすべての行を選択します(データにはOR
関係があります)。
// The array you want to use for your field list
$data = array (
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3'
);
// A temporary array to hold the fields in an intermediate state
$whereClause = array();
// Iterate over the data and convert to individual clause elements
foreach ($data as $key => $value) {
$whereClause[] = "`$key` = :$key";
}
// Construct the query
$query = '
SELECT *
FROM `table_name`
WHERE '.implode(' OR ', $whereClause).'
';
// Prepare the query
$stmt = $db->prepare($query);
// Execute the query
$stmt->execute($data);
IN (<value list>)
配列を使用して句の値リストを作成するこれを実現する最も簡単な方法は、疑問符のプレースホルダーを使用することです。
ここに、指定された列名と照合する5つの文字列の配列があり、列の値が5つの配列値の少なくとも1つと一致するすべての行を返します。
// The array of values
$data = array (
'value1',
'value2',
'value3',
'value4',
'value5'
);
// Construct an array of question marks of equal length to the value array
$placeHolders = array_fill(0, count($data), '?');
// Normalise the array so it is 1-indexed
array_unshift($data, '');
unset($data[0]);
// Construct the query
$query = '
SELECT *
FROM `table_name`
WHERE `field` IN ('.implode(', ', $placeHolders).')
';
// Prepare the query
$stmt = $db->prepare($query);
// Execute the query
$stmt->execute($data);
名前付きプレースホルダーを使用してクエリを使用することを既に決定している場合、この手法はもう少し複雑ですが、それほど多くはありません。配列をループして連想配列に変換し、名前付きプレースホルダーを作成するだけです。
// The array of values
$data = array (
'value1',
'value2',
'value3',
'value4',
'value5'
);
// Temporary arrays to hold the data
$placeHolders = $valueList = array();
// Loop the array and construct the named format
for ($i = 0, $count = count($data); $i < $count; $i++) {
$placeHolders[] = ":list$i";
$valueList["list$i"] = $data[$i];
}
// Construct the query
$query = '
SELECT *
FROM `table_name`
WHERE `field` IN ('.implode(', ', $placeHolders).')
';
// Prepare the query
$stmt = $db->prepare($query);
// Execute the query
$stmt->execute($valueList);