2012-01-05 2 views
1

Я использую расширение mysqli в php для подключения к базе данных. У меня такой простой вопрос. Лучше ли использовать mysqli вместо mysql и почему необходимо использовать mysqli_real_escape_string? что делает эта функция? Спасибо ...mysqli_real_escape_string с использованием среды

+1

Сторона примечания: рассмотрите использование PDO. Он настолько же эффективен, как и MySQLi (если не лучше), его легче освоить и его можно использовать с другими СУБД, кроме MySQL. –

ответ

2

Я приведу небольшой пример, не использующий SQL. Представьте, у вас есть это PHP код:

<?php 
echo 'Hello, world!'; 

Теперь вы хотите заменить world с O'Hara:

<?php 
echo 'Hello, O'Hara!'; // Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' 

Да, конечно, это не является допустимым PHP. Вам нужно, чтобы избежать одинарных кавычек, так как это интерпретируется как буквальная цитата, а не разделитель строки:

<?php 
echo 'Hello, O\'Hara!'; 

У вас есть точно такая же проблема при составлении запросов SQL. Если вы вводите случайный ввод в свой код, рано или поздно он сломается. Вам нужно указать encode, поэтому он обрабатывается как литеральный ввод, а не сломанный код.

Как вы можете это сделать? Ну, MySQL принимает \' точно так же, как PHP (хотя это только совпадение: другие механизмы базы данных используют другие методы эвакуации). Таким образом, тупое решение добавить обратную косую черту здесь и здесь:

SELECT id FROM user WHERE name='O\'Hara'; 

Конечно, это очень много работы на жесткий код всех возможных символов, которые нужны бежать (и вы, вероятно, забыли некоторые из них) поэтому вы можете использовать функцию, которая выполняет эту работу: mysql_real_escape_string() или mysqli_real_escape_string().

Вопрос в следующем: это достаточно хорошо? Ну, вроде работаю, но это приводит к раздражающему коду, который трудно поддерживать:

$sql = "UPDATE user SET name='" . mysql_real_escape_string($name) . "' WHERE id='" . mysql_real_escape_string($id) . "'"; 

... и вы все еще должны заботиться о окружающем полной стоимости с одинарными кавычками ... которые не всегда обязательный (думать о числах) ... Какой беспорядок. Не может ли кто-нибудь придумать что-то лучше? Хорошая новость: они сделали!Это называется подготовленные заявления:

// Just an example, I invented the syntax 
$sql = 'UPDATE user SET name=:name WHERE id=:id'; 
$params = array(
    'name' => "O'Brian", 
    'id' => 31416, 
); 
$MyDbConnection->execute($sql, $params); 

В реальной жизни:

  • MySQLi имеет метод prepare() для достижения этой цели. Find some examples there.
  • Устаревшее расширение MySQL ... не имеет ничего: оно не поддерживает подготовленные заявления вообще! Если вы используете это расширение, вы застряли в раздражающих методах add-quotes-yourself и методах конкатенации строк.

Надеюсь, это объяснит весь вопрос.

+0

Спасибо за объяснение :) – DaHaKa

+0

Так что если я использую функцию mysqli_prepare(), нет необходимости использовать mysqli_real_escape_string да? – DaHaKa

+0

Не только это не обязательно: если вы используете оба варианта, вы в итоге входите в настоящие фиктивные символы «\», вставленные в базу данных, точно так же, как ввод «echo» Hello, O \\\ 'Hara!'; ' –

1

Mysql немного быстрее, чем Mysqli, но это не повлияет на 99% веб-разработки. Реальное преимущество заключается в том, что Mysqli более ориентирован на классы и методы.

Mysqli_real_escape_string - это предосторожная функция, позволяющая избежать любых незаконных/вредоносных символов в строке, которую вы собираетесь использовать в запросе Mysql. Существует также стандартная функция mysql_real_escape_string. Если сомневаешься, лучше использовать его, чем не использовать, но будьте осторожны, слишком много может вызвать проблемы с вашими сценариями/запросами.

Чтобы сократить это, если вы пишете процедурный PHP, используйте стандартный Mysql, но если вы пишете ориентированный на объект код, используйте Mysqli и максимизируйте его потенциал. Вы всегда должны делать свои запросы безопасными, mysql_real_escape_string - это всего лишь один способ.

Надеюсь, это поможет!

Смежные вопросы