Что такое PDO-эквивалент функции mysql real escape string?
Я изменяю свой код с помощью mysql_*
до PDO
. В моем коде было mysql_real_escape_string()
. Что эквивалентно этому в PDO?
5 ответов
Ну нет, нет!
технически нет 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=xx;charset=utf8", "xx", "xx", [
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 ]
as описано в этом ответе
но, используя подготовленные операторы, как показано выше, всегда будет безопаснее, чем использование любой из функций, которые начинаются с mysql_
хорошо читает
PDO учебник для разработчиков MySQL
нет*! Объект 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;");
* Ну, есть один, как сказал Михаил Берковский! Но есть и лучшие способы.
$v = '"'.mysql_real_escape_string($v).'"';
эквивалентно $v = $this->db->quote($v);
убедитесь, что у вас есть экземпляр PDO в $this->db
таким образом, вы можете вызвать метод pdo quote()
Не нужно использования mysql_real_escape_string в PDO.
PDO сам настраивает специальный символ в запросе mysql, вам нужно только передать анонимный параметр и связать его время выполнения.вроде этого Предположим, у вас есть таблица пользователя с именем атрибута, электронной почтой и паролем, и вы должны вставить в эту инструкцию use prepare вы можете передать имя как = > $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();
}
Если ответить на исходный вопрос, то это эквивалент 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);
}
кстати, эквивалент mysqli:
function my_real_escape_string($value, $connection) {
return mysqli_real_escape_string($connection, $value);
}