PHP: mysql v mysqli v pdo
Я читал некоторые вопросы относительно использования mysqli versus pdo для использования mysql в php.
Я видел такие вопросы, как mysqli или PDO - каковы плюсы и минусы? или Переход от mysql к mysqli или pdo?, которые имеют дело исключительно с mysqli v pdo. Меня не так интересует, какой из этих двух методов лучше.
Мне было интересно, почему следует избегать функций mysql_. Конечно, они находятся в процессе устаревания для документации PHP http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated, поток PHP PDO и MySQLi показывают, что PDO и MySQLi более эффективны, а поток В чем разница между MySQL, MySQLi и PDO? подразумевает, что эти новые методы более безопасны.
В целом, мне интересно, какие большие недостатки в методах mysql_ и какие причины есть для его устранения (я думаю, более конкретно, чем просто потому, что он устарел). Я планирую обновить мои затронутые сценарии и стал любопытно, почему этот старый метод устарел.
Спасибо!
Ответы
Ответ 1
Конструкция функции mysql_query
такова, что вы должны быть осторожны, чтобы избежать каждого бита данных, которые вы вводите в нее, и если вы пропустите хотя бы одно, ваше приложение может быть уничтожено автоматический инструмент для поиска уязвимостей SQL.
Обе подставки mysqli
и PDO, которые необходимы для обеспечения безопасности ваших запросов от ошибок SQL-инъекций. Вызов mysql_real_escape_string
на все это не только утомительно, но и подвержен ошибкам, и что там возникают проблемы.
Функции mysql
являются продуктом самых ранних дней PHP и значительно более ограничены, чем новые объектно-ориентированные функции, предлагаемые как mysqli
как опция, так и PDO по дизайну.
Существует ряд очень веских причин использовать один из этих двух новых интерфейсов, но самое главное, что функция mysql_query
просто слишком опасна для использования в производственном коде. С этим вы всегда будете одной ошибкой от некоторых очень серьезных проблем.
Там причина разрывов баз данных, полная паролей, и номера кредитных карт продолжают появляться. Наличие очевидной точки впрыска SQL делает почти слишком легко полностью захватить сайт.
Ответ 2
От выбора MySSQL API @PHP.net:
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);
Создание объекта, такого как mysqli и PDO, является рекомендуемым способом написания любого современного программного обеспечения. Разрыв mysql был выпущен для PHP версии 2.0 и с тех пор не был переписан. PHP 2.0 был выпущен в 1997 году, этого должно быть достаточно, чтобы объяснить, почему его не использовать.
Ответ 3
Хорошо для одного, функции mysql чрезвычайно подвержены SQL-инъекции, если вы неправильно очищаете ввод вручную. mysqli и pdo имеют параметризованные параметры оператора sql, избегая этого риска. На мой взгляд, у них также, как правило, лучший стиль кодирования.