Я конвертирую часть моего кода, который использовал функции ext / mysql ( mysql_*()
) для PDO и подготовленных операторов. Раньше, когда я динамически mysql_real_escape_string()
запросы, я просто передавал свои строки через mysql_real_escape_string()
и mysql_real_escape_string()
их прямо в мой запрос, но теперь я считаю, что мне нужно передать значения в виде массива при выполнении запроса или привязать переменные до выполнения ,
Как я могу преобразовать старый код для использования нового драйвера базы данных?
Миграция ваших запросов из ext / mysql в подготовленные заявления PDO требует нового подхода к ряду аспектов. Здесь я расскажу о нескольких общих задачах, которые необходимо регулярно выполнять. Это ни в коем случае не является исчерпывающим, чтобы соответствовать любой возможной ситуации, оно просто предназначено для демонстрации некоторых методов, которые можно использовать при динамическом генерировании запросов.
Прежде чем мы начнем, нужно запомнить несколько вещей – если что-то не работает правильно, проверьте этот список, прежде чем задавать вопросы!
mysql_real_escape_string()
. См. Это для полного объяснения. $_POST
, $_GET
, $_COOKIE
или любые другие данные, поступающие из внешнего источника, чтобы указать имена столбцов. Перед созданием динамического запроса необходимо предварительно обработать эти данные. :name
. При передаче данных для выполнения соответствующие ключи массива могут необязательно включать в себя ведущий :
но это не требуется. Имя заполнитель должен содержать только буквенно-цифровые символы. Весь приведенный ниже примерный пример предполагает, что соединение с базой данных установлено и что соответствующий экземпляр PDO хранится в переменной $db
.
Самый простой способ сделать это – с именами заполнителей.
С ext / mysql можно было бы избежать значений по мере создания запроса и поместить экранированные значения непосредственно в запрос. При построении подготовленного оператора PDO мы используем ключи массива, чтобы вместо этого указывать имена заполнителей, поэтому мы можем передать массив непосредственно в PDOStatement::execute()
.
В этом примере мы имеем массив из трех пар ключ / значение, где ключ представляет имя столбца, а значение представляет значение столбца. Мы хотим выбрать все строки, в которых сопоставляется любой из столбцов (данные имеют отношение 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 строк, которые мы хотим сопоставить с заданным именем столбца, и возвращаем все строки, где значение столбца соответствует хотя бы одному из пяти значений массива.
// 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' ); // 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);