Почему мы не должны использовать функции mysql *?


очень распространенный вопрос в том, почему мы должны прекратить использовать функции mysql_* ? Например mysql_query() и mysql_connect().

я Вижу, что многие люди используют их, или перестать использовать, но не знают истинной причины. Почему они должны перестать быть использованы, поскольку они работают?

 242
Author: Wallace Maxters, 2013-12-18

6 answers

Аннотация

, ответ один: мы не должны использовать функции расширения "mysql", за его разработку, были прекращена; расширение стал устаревшей, например, код, который использует эти функции не будет работать в будущих версиях PHP.


Информация

Пользователь сайта Stack Overflow на английском языке, писал:

There is no security problem with library itself but rather with library users (нет никаких проблем безопасности в библиотеке как таковой, а с пользователей библиотеки " ).

Голосования, чтобы прекратить (deprecate) - или-не, в результате 25 голосов " за "12 голосов, "против" . Было хорошее большинство, но это решение не было единогласным. См официальный источник.

В Этом же источника, другой разработчик написал:

The extension is not broken. The problem is the bad usage. It can be used safely, and good developers have been doing so for ages (, расширение не имеет дефектов. проблема заключается в неправильном использовании. Она может быть использована безопасно, и хорошие разработчики сделали это в течение многих лет).

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

ext/mysql is hard to maintain code. It is not getting new features. Keeping it up to date for working with new versions of libmysql or mysqlnd versions is work, we probably could spend that time better.

(расширение mysql, содержится код трудно поддерживать. Не получать новые "возможности". Поддерживать ее актуальность для работы с новые версии libmysqld и mysqlnd является трудоемким; мы могли бы использовать лучше это время.)

Другими словами: "Чтобы иметь неприятности, чтобы сохранить этот код, старик?", ибо в той мере, в том, что новые в версиях MySQL (и его "client libs") учитываются, расширение нуждается в обновлении...

...и, кроме того, уже существуют расширения mysqli (более современной) и альтернативные PDO... тогда... чтобы продолжить, сохраняя при этом? Давайте прекращать? Там, 25 проголосовали "да", 12 проголосовали "нет", и решение было принято.


Комментарий Принадлежности

Когда я начал с PHP не существует расширение PDO. Я использовал расширение "mysql", как и большинство, до я работал в проекте с помощью "mysqli" и узнал из преимуществ, и всегда предпочитал же с тех пор.

Вскоре после этого, я написал несколько классов, которые расширяют уникальные расширения mysqli, и я использую по сегодняшний чистого PHP, то есть, когда я не с помощью framework Laravel, с его "Fluent", и "Eloquent", Symfony с "Doctrine", etc...

Для меня, привык к detalhezinhos подготовить предложения "LIKE" доказательство атаки, на "черный ящик" этих "prepared statements", "Active Record" или "ORM" воспринималась с подозрением. Этот этап прошел, и сегодня я поклонник Eloquent, который поставляется с Laravel 4...


Дополнительному соглашению

После публикации весь ответ выше, я почувствовал, необходимо подчеркнуть важность фактора "not getting new features" на решение прекратить расширение. Я имею в виду: несмотря на то, что его можно быстро (best performance) в выполнении простых задач, ей осталось всего спектр функциональных возможностей, расширения альтернативных (mysqli и PDO) содержат (transactions, поддержку SSL, etc) - момент, который был выделен на другие ответы здесь.

 250
Author: J. Bruni, 2017-09-27 15:57:02

, Поскольку использование функций mysql_* было с неодобрением (deprecated) начиная с PHP 5.5, согласно документации, функции будут удалены в будущих версиях PHP, что делает программы, которые используют перестают работать в этих версиях.

Ограничения функций mysql_*

В отличие от функций mysqli_*, функций mysql_*, не поддерживающих

  • асинхронные запросы, не блокирует
  • запросы с параметрами
  • stored procedures
  • транзакций

Отсутствие поддержки параметризованные запросы означает, что, при использовании функции mysql_* не принять определенные меры предосторожности, программы подвержена атак SQL-инъекция, ставя под угрозу безопасность и целостность данных. Пример:

// consulta vulnerável a injeção de SQL
$query = mysql_query("SELECT * FROM alunos WHERE id = $id")

// consulta parametrizada, variável $id é higienizada
$query = mysqli_query("SELECT * FROM alunos WHERE id = ?")
$query->bind_param("i", $id);

Альтернатив

Кроме того, рекомендуется использовать функции mysqli_*, которые преодолевают ограничения, уже упомянутые функции mysql_*.

Другой способ-это использовать PDO (PHP Data Objects), который обеспечивает уровень абстракции доступа к данным, что означает, что, независимо от того, какую базу данных вы используете, вы можете использовать те же функции для выдачи запросов и извлечения данных.

История

, Чтобы узнать историю за неодобрение функций mysql_* см ответ, J. Bruni.

 121
Author: rodrigorgs, 2014-08-16 10:51:45

Мы больше Не должны использовать mysql_*, по следующей причине:

INSERT INTO usuarios SET nome='$nome';

Значение передается непосредственно в запрос sql, это оставляет приложение уязвимым для атак sql injection. С pdo:

$con->prepare("INSERT INTO usuarios SET nome=?");
$con->bindParam(1, $nome);
$con->execute();

При использовании pdo запрос подготовлен, проходя через защитный слой, этот слой, что mysql_* не имеет, в настоящее время заменить значения, этот уровень защиты вступает в действие, проверка, если команды вроде sql-инъекций.

 61
Author: Programador, 2014-03-06 02:24:44

", причина просто уже достаточно много:

Это расширение Mysql прекращено группой разработчиков PHP. Но дайте вы мне вопрос, потому что она была прекращена, поскольку это было просто и работало здорово? Говорю тебе,: В соответствии PHP становится все более объектно-ориентированной, и это расширение Mysql был создан для PHP структурный, она начала сбои в среде объектно-ориентированного. Не поддерживает Хранимые процедуры. Не поддерживает сделка. Работает только с Mysql до 5.0. ... Среди других. См. сравнительный здесь

, То код с mysql методами будет иметь дефицит в будущем для поддержки новых реализаций и для устранения будущих ошибок. Использовать PHP PDO.

 54
Author: Guerra, 2017-06-30 02:19:18

Мы Видим, что у нас есть много ответов об этом, но, короче говоря, все, что последняя версия PHP (или на любом языке) войдите в состояние устарела, мы должны изменить, попытаться адаптировать код и, если возможно, использовать новейшие функции, которые могут стать стандартом в будущем, и PDO пример. К сожалению, программистов, что, в конечном итоге, игнорируя это, и будут только научиться и сделать какие-то корректировки, когда это делается, то перенос на другой сервер или что-то вроде того, что начало обвинять в ошибке. Во всяком случае, необходимое изменение, рано или поздно, должно быть сделано, и, к счастью, через некоторое время использовать PDO или MySQLI будет, как сделать mysql_*

 47
Author: braulio_holtz, 2014-03-06 02:42:30

Галера отправлю только для мелочи: ниже изображение, преимущества и недостатки mysql, mysqli и PDO. inserir a descrição da imagem aqui

 41
Author: Tiago, 2016-05-24 12:50:07