Я изменяю свой код с помощью mysql_*
до PDO
. В моем коде у меня был mysql_real_escape_string()
. Что эквивалентно этому в PDO?
Что такое PDO-эквивалент функции mysql_real_escape_string?
Ответ 1
Нет, нет!
Технически, существует PDO::quote()
, но он редко когда-либо используется и не является эквивалентом mysql_real_escape_string()
Это правильно! Если вы уже используете PDO надлежащим образом, как задокументировано с использованием подготовленных операторов, то это защитит вас от внедрения MySQL.
# Example:
Ниже приведен пример безопасного запроса к базе данных с использованием подготовленных операторов (pdo)
try {
// first connect to database with the PDO object.
$db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(\PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
И теперь, предполагая, что соединение установлено, вы можете выполнить свой запрос следующим образом.
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(\PDO::FETCH_ASSOC);
var_dump($cars);
}
Теперь, как вы, вероятно, можете сказать, я не использовал ничего, чтобы избежать/очистить значение $_POST["color"]
. И этот код защищен от myql-инъекций благодаря PDO и силе готовых операторов.
Стоит отметить, что вы должны передать charset=utf8
как атрибут в вашем DSN
, как показано выше, из соображений безопасности, и всегда включать
PDO для отображения ошибок в виде исключений.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
поэтому ошибки в ваших запросах к базе данных не будут содержать конфиденциальных данных, таких как структура вашего каталога, имя пользователя базы данных и т.д.
И последнее, но не менее важное: бывают моменты, когда вам не следует доверять PDO на 100%, и вы обязаны принять некоторые дополнительные меры для предотвращения внедрения SQL-кода, одним из таких случаев является случай, если вы используете устаревшие версии mysql [ mysql =< 5.3.6 ]
в качестве описано в этом ответе
Но использование подготовленных операторов, как показано выше, всегда будет безопаснее, чем использование любой из функций, начинающихся с mysql_
Хорошо читает
Учебник по PDO для разработчиков MySQL
Ответ 2
Нет ни одного! Объектом PDO является то, что вам не нужно ничего избегать; вы просто отправляете его как данные. Например:
$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!
В отличие от:
$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");
* Ну, есть один, как сказал Майкл Берковски! Но есть лучшие способы.
Ответ 3
$v = '"'.mysql_real_escape_string($v).'"';
является эквивалентом $v = $this->db->quote($v);
убедитесь, что у вас есть экземпляр PDO в $this->db
, поэтому вы можете вызвать метод pdo quote()
Ответ 4
Нет необходимости в mysql_real_escape_string в PDO.
PDO сам настраивает специальный символ в запросе MySQL, вам нужно только передать анонимный параметр и связать его во время выполнения. Предположим, у вас есть пользовательская таблица с именем атрибута, адресом электронной почты и паролем, и вы должны вставить в это выражение о подготовке, например Вы можете передать имя как => $ name = "Rajes'h";
он должен выполняться без необходимости эквивалента mysql_real_escape_string
$stmt="INSERT into user(name,email,password) VALUES(:name,:email,:password)";
try{
$pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
$pstmt->bindParam(':name',$name,PDO::PARAM_STR);
$pstmt->bindParam(':email',$email,PDO::PARAM_STR);
$pstmt->bindParam(':password',$password,PDO::PARAM_STR);
$status=$pstmt->execute();
if($status){
//next line of code
}
}catch(PDOException $pdo){
echo $pdo->getMessage();
}
Ответ 5
Если для ответа на исходный вопрос, то это эквивалент PDO для mysql_real_escape_string
:
function my_real_escape_string($value, $connection) {
/*
// this fails on: value="hello'";
return trim ($connection->quote($value), "'");
*/
return substr($connection->quote($value), 1, -1);
}
btw эквивалент mysqli:
function my_real_escape_string($value, $connection) {
return mysqli_real_escape_string($connection, $value);
}
Ответ 6
В ответ на комментарии многих людей здесь, но я пока не могу комментировать напрямую (не набрал 50 баллов), там НАСТОЯТЕЛЬНО необходимо использовать ДАЖЕ $dbh->quote($value)
при использовании PDO, и это вполне оправданные причины...
- Если вы просматриваете много записей, создавая команду "BULK INSERT" (я обычно перезагружаюсь на 1000 записей) из-за использования таблиц InnoDb в MySQL/Maria Db. Создание отдельных команд вставки с использованием подготовленных операторов очень удобно, но крайне неэффективно при выполнении массовых задач!
- PDO еще не может работать с динамическими структурами IN (...), поэтому, когда вы создаете список строк IN из списка пользовательских переменных, ВАМ НУЖНО
$dbh->quote($value)
каждое значение в списке!
Так что да, при использовании PDO необходимо использовать $dbh->quote($value)
и, вероятно, ПОЧЕМУ команда доступна в первую очередь.
PS, вам по-прежнему не нужно заключать в кавычки команду, команда $dbh->quote($value)
также сделает это за вас.
Вне.