застрял в коде с ошибкой Вызов неопределенной функции mysql_query (). что я должен делать? [Дубликат]

Я думаю, что когда вы определяете String, вы определяете объект. Поэтому вам нужно использовать .equals(). Когда вы используете примитивные типы данных, вы используете ==, но с String (и любым объектом) вы должны использовать .equals().

2255
задан Bukharov Sergey 13 December 2017 в 17:11
поделиться

13 ответов

Расширение MySQL:

  • Не находится в активной разработке
  • Официально устарела с PHP 5.5 (выпущена в июне 2013 г.).
  • Полностью удален с PHP 7.0 (выпущен в декабре 2015 года). Это означает, что с 31 декабря 2018 года он не будет существовать ни в одной поддерживаемой версии PHP. В настоящее время он получает обновления security .
  • Недостаток интерфейса OO
  • Не поддерживает: неблокирующие, асинхронные запросы Подготовленные операторы или параметризованные запросы Хранимые процедуры Несколько операторов транзакций «Новые», метод аутентификации пароля (по умолчанию в MySQL 5.6, требуется в 5.7). Все функциональные возможности в MySQL 5.1

Поскольку он устарел, использование его делает ваш код менее надежным.

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

См. сравнение расширений SQL .

1816
ответ дан 20 revs, 13 users 51% 15 August 2018 в 20:23
поделиться
  • 1
    Недостаточно устаревшей причине достаточно, чтобы избежать их. Они не будут там в один прекрасный день, и вы не будете счастливы, если будете полагаться на них. Остальное - это просто список вещей, которые используют старые расширения, чтобы люди не учились. – Tim Post♦ 12 October 2012 в 14:26
  • 2
    Усталость - это не волшебная пуля, которую все, кажется, считают. Сам PHP не будет ни одного дня, но мы полагаемся на инструменты, которыми мы располагаем сегодня. Когда мы будем менять инструменты, мы это сделаем. – Lightness Races in Orbit 24 December 2012 в 16:29
  • 3
    @LightnessRacesinOrbit - Усталость - это не волшебная пуля, это флаг, который говорит «Мы признаем, что это отстой, поэтому мы не будем поддерживать его гораздо дольше». Хотя лучшая будущая проверка кода является хорошей причиной для отказа от устаревших функций, она не единственная (или даже основная). Измените инструменты, потому что есть лучшие инструменты, а не потому, что вы вынуждены. (И изменение инструментов, прежде чем вы будете вынуждены означать, что вы не изучаете новые, только потому, что ваш код перестает работать и нуждается в фиксации вчера ... что самое худшее время для изучения новых инструментов). – Quentin 24 December 2012 в 19:43
  • 4
    Одна вещь, о которой я не видел, упоминал об отсутствии подготовленных заявлений, - проблема производительности. Каждый раз, когда вы выдаете инструкцию, something должен скомпилировать ее, чтобы демон MySQL мог ее понять. С помощью этого API, если вы выдаете 200 000 одного запроса в цикле, это 200 000 раз, когда запрос должен быть скомпилирован для MySQL, чтобы понять его. С помощью подготовленных операторов он компилируется один раз, а затем значения параметризуются в скомпилированный SQL. – Goldentoa11 14 December 2013 в 19:58
  • 5
    @symcbean. Конечно, not не поддерживает подготовленные операторы. Это на самом деле главная причина, почему она устарела. Без (простых в использовании) подготовленных операторов расширение mysql часто становится жертвой атак SQL-инъекций. – rustyx 5 April 2014 в 21:30

Расширение MySQL является самым старым из трех и было оригинальным способом, которым разработчики использовали для связи с MySQL. Это расширение теперь устарело в пользу других двух альтернатив из-за улучшений, сделанных в более новых версиях как PHP, так и MySQL.

  • MySQLi является улучшенным расширением для работы с базами данных MySQL. Он использует функции, доступные в более новых версиях сервера MySQL, предоставляет разработчику как функционально-ориентированный, так и объектно-ориентированный интерфейс, а также делает несколько других отличных вещей.
  • PDO предлагает API, который объединяет большинство функций, которые ранее были распространены через основные расширения доступа к базе данных, то есть MySQL, PostgreSQL, SQLite, MSSQL и т. д. Интерфейс предоставляет объекты высокого уровня для программиста для работы с подключениями к базе данных , запросы и результирующие наборы, а драйверы низкого уровня выполняют связь и обработку ресурсов с сервером базы данных. Много дискуссий и работы идет в PDO, и это считается подходящим способом работы с базами данных в современном профессиональном коде.
30
ответ дан Alexander 15 August 2018 в 20:23
поделиться

Функции mysql_:

  1. устарели - они больше не поддерживаются
  2. не позволяют легко перемещаться в другой бэкэнд базы данных
  3. не поддерживают подготовленные инструкции, поэтому
  4. поощряет программистов использовать конкатенацию для создания запросов, что приводит к уязвимости SQL-инъекций
135
ответ дан Alnitak 15 August 2018 в 20:23
поделиться
  • 1
    # 2 в равной степени относится к mysqli_ – eggyal 12 October 2012 в 14:35
  • 2
    чтобы быть справедливым, учитывая вариации на диалекте SQL, даже PDO не дает вам № 2 с какой-либо степенью определенности. Для этого вам понадобится надлежащая ORM-обертка. – SDC 23 October 2012 в 15:55
  • 3
    @SDC действительно - проблема со стандартами заключается в том, что есть so многие из них ... – Alnitak 23 October 2012 в 16:06
  • 4
    xkcd.com/927 – Lightness Races in Orbit 24 December 2012 в 16:30
  • 5
    функция mysql_* является оболочкой в ​​функции mysqlnd для более новых версий PHP. Поэтому, даже если прежняя клиентская библиотека больше не поддерживается, mysqlnd поддерживается :) – hakre 31 May 2013 в 15:25
200
ответ дан Community 15 August 2018 в 20:23
поделиться
62
ответ дан Fluffeh 15 August 2018 в 20:23
поделиться
1164
ответ дан Jay Dadhania 15 August 2018 в 20:23
поделиться

Функции, подобные типу mysql_connect(), mysql_query(), представляют собой предыдущие функции PHP, т. е. (PHP 4) и теперь не используются.

Они заменяются на mysqli_connect() , mysqli_query() аналогично в последнем PHP5.

Это причина ошибки.

0
ответ дан Jules Dupont 15 August 2018 в 20:23
поделиться

Можно определить почти все функции mysql_ *, используя mysqli или PDO. Просто включите их поверх своего старого PHP-приложения, и он будет работать на PHP7. Мое решение здесь .

<?php

define('MYSQL_LINK', 'dbl');
$GLOBALS[MYSQL_LINK] = null;

function mysql_link($link=null) {
    return ($link === null) ? $GLOBALS[MYSQL_LINK] : $link;
}

function mysql_connect($host, $user, $pass) {
    $GLOBALS[MYSQL_LINK] = mysqli_connect($host, $user, $pass);
    return $GLOBALS[MYSQL_LINK];
}

function mysql_pconnect($host, $user, $pass) {
    return mysql_connect($host, $user, $pass);
}

function mysql_select_db($db, $link=null) {
    $link = mysql_link($link);
    return mysqli_select_db($link, $db);
}

function mysql_close($link=null) {
    $link = mysql_link($link);
    return mysqli_close($link);
}

function mysql_error($link=null) {
    $link = mysql_link($link);
    return mysqli_error($link);
}

function mysql_errno($link=null) {
    $link = mysql_link($link);
    return mysqli_errno($link);
}

function mysql_ping($link=null) {
    $link = mysql_link($link);
    return mysqli_ping($link);
}

function mysql_stat($link=null) {
    $link = mysql_link($link);
    return mysqli_stat($link);
}

function mysql_affected_rows($link=null) {
    $link = mysql_link($link);
    return mysqli_affected_rows($link);
}

function mysql_client_encoding($link=null) {
    $link = mysql_link($link);
    return mysqli_character_set_name($link);
}

function mysql_thread_id($link=null) {
    $link = mysql_link($link);
    return mysqli_thread_id($link);
}

function mysql_escape_string($string) {
    return mysql_real_escape_string($string);
}

function mysql_real_escape_string($string, $link=null) {
    $link = mysql_link($link);
    return mysqli_real_escape_string($link, $string);
}

function mysql_query($sql, $link=null) {
    $link = mysql_link($link);
    return mysqli_query($link, $sql);
}

function mysql_unbuffered_query($sql, $link=null) {
    $link = mysql_link($link);
    return mysqli_query($link, $sql, MYSQLI_USE_RESULT);
}

function mysql_set_charset($charset, $link=null){
    $link = mysql_link($link);
    return mysqli_set_charset($link, $charset);
}

function mysql_get_host_info($link=null) {
    $link = mysql_link($link);
    return mysqli_get_host_info($link);
}

function mysql_get_proto_info($link=null) {
    $link = mysql_link($link);
    return mysqli_get_proto_info($link);
}
function mysql_get_server_info($link=null) {
    $link = mysql_link($link);
    return mysqli_get_server_info($link);
}

function mysql_info($link=null) {
    $link = mysql_link($link);
    return mysqli_info($link);
}

function mysql_get_client_info() {
    $link = mysql_link();
    return mysqli_get_client_info($link);
}

function mysql_create_db($db, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    return mysqli_query($link, "CREATE DATABASE `$db`");
}

function mysql_drop_db($db, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    return mysqli_query($link, "DROP DATABASE `$db`");
}

function mysql_list_dbs($link=null) {
    $link = mysql_link($link);
    return mysqli_query($link, "SHOW DATABASES");
}

function mysql_list_fields($db, $table, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    $table = str_replace('`', '', mysqli_real_escape_string($link, $table));
    return mysqli_query($link, "SHOW COLUMNS FROM `$db`.`$table`");
}

function mysql_list_tables($db, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    return mysqli_query($link, "SHOW TABLES FROM `$db`");
}

function mysql_db_query($db, $sql, $link=null) {
    $link = mysql_link($link);
    mysqli_select_db($link, $db);
    return mysqli_query($link, $sql);
}

function mysql_fetch_row($qlink) {
    return mysqli_fetch_row($qlink);
}

function mysql_fetch_assoc($qlink) {
    return mysqli_fetch_assoc($qlink);
}

function mysql_fetch_array($qlink, $result=MYSQLI_BOTH) {
    return mysqli_fetch_array($qlink, $result);
}

function mysql_fetch_lengths($qlink) {
    return mysqli_fetch_lengths($qlink);
}

function mysql_insert_id($qlink) {
    return mysqli_insert_id($qlink);
}

function mysql_num_rows($qlink) {
    return mysqli_num_rows($qlink);
}

function mysql_num_fields($qlink) {
    return mysqli_num_fields($qlink);
}

function mysql_data_seek($qlink, $row) {
    return mysqli_data_seek($qlink, $row);
}

function mysql_field_seek($qlink, $offset) {
    return mysqli_field_seek($qlink, $offset);
}

function mysql_fetch_object($qlink, $class="stdClass", array $params=null) {
    return ($params === null)
        ? mysqli_fetch_object($qlink, $class)
        : mysqli_fetch_object($qlink, $class, $params);
}

function mysql_db_name($qlink, $row, $field='Database') {
    mysqli_data_seek($qlink, $row);
    $db = mysqli_fetch_assoc($qlink);
    return $db[$field];
}

function mysql_fetch_field($qlink, $offset=null) {
    if ($offset !== null)
        mysqli_field_seek($qlink, $offset);
    return mysqli_fetch_field($qlink);
}

function mysql_result($qlink, $offset, $field=0) {
    if ($offset !== null)
        mysqli_field_seek($qlink, $offset);
    $row = mysqli_fetch_array($qlink);
    return (!is_array($row) || !isset($row[$field]))
        ? false
        : $row[$field];
}

function mysql_field_len($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    return is_object($field) ? $field->length : false;
}

function mysql_field_name($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    if (!is_object($field))
        return false;
    return empty($field->orgname) ? $field->name : $field->orgname;
}

function mysql_field_table($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    if (!is_object($field))
        return false;
    return empty($field->orgtable) ? $field->table : $field->orgtable;
}

function mysql_field_type($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    return is_object($field) ? $field->type : false;
}

function mysql_free_result($qlink) {
    try {
        mysqli_free_result($qlink);
    } catch (Exception $e) {
        return false;
    }
    return true;
}
280
ответ дан Nae 15 August 2018 в 20:23
поделиться
  • 1
    Есть еще одна вещь: я думаю, что функция по-прежнему существует в PHP только по одной причине - совместимость со старыми, устаревшими, но все еще запущенными CMS, электронной коммерцией, системами доски объявлений и т. Д. Наконец, она будет удалена, и вам придется переписать заявление... – Kamil 13 November 2012 в 13:49
  • 2
    @Kamil: Это правда, но на самом деле это не причина, почему вы не должны ее использовать. Причина не в том, чтобы использовать его, потому что он древний, небезопасный и т. Д. :) – Madara Uchiha♦ 13 November 2012 в 13:50
  • 3
    @Mario - у разработчиков PHP есть процесс, и они только что голосовали за формально устаревший ext / mysql от 5.5. Это уже не гипотетическая проблема. – SDC 10 December 2012 в 17:00
  • 4
    The old functions will allow executing of multiple statements per query - нет, они не будут. Такая инъекция невозможна с помощью ext / mysql - единственный способ, которым этот вид инъекции возможен с PHP, а MySQL - при использовании MySQLi и функции mysqli_multi_query(). Типичная инъекция, которая возможна с помощью ext / mysql и unescaped строк, - это такие вещи, как ' OR '1' = '1 для извлечения данных из базы данных, которая не должна была быть доступна. В некоторых ситуациях можно вводить подзапросы, однако до сих пор невозможно изменить базу данных таким образом. – DaveRandom 30 December 2012 в 22:58
  • 5
    Добавление нескольких дополнительных строк с проверенной техникой, такой как PDO или MySQLi, по-прежнему позволяет легко использовать PHP, который всегда предлагался. Я надеюсь, что разработчик знает, что видение этих ужасных функций mysql_ * в любом учебном пособии фактически умаляет урок и должно сказать OP, что этот код является soooo 10 лет назад, - и должен задать вопрос о том, актуальность учебника тоже! – FredTheWebGuy 31 December 2012 в 19:28
  • 6
    Какой ответ должен уместно упомянуть: подготовленное заявление убирает какое-либо значимое использование IN (...) construct. – Eugen Rieck 14 December 2013 в 21:36
  • 7
    Ваш ответ слишком длинный, а реальное резюме - «mysql ext is no more». Это все – Your Common Sense 7 September 2016 в 15:13
  • 8
    @YourCommonSense Мой ответ заключается в том, почему mysqli заменил mysql. Дело в том, что Mysqli существует сегодня, поэтому используйте его. Все это знают! – Ani Menon 7 September 2016 в 15:16
  • 9
    Ну, кроме того, что никто не спрашивал, почему mysqli заменил mysql, он тоже не отвечает на этот вопрос. Он отвечает, почему был введен mysqli. Но это не объясняет, почему mysql и mysqli не позволяли жить параллельно – Your Common Sense 7 September 2016 в 15:19
  • 10
    @YourCommonSense Также вопрос OP «Почему я должен использовать что-то еще, даже если они работают на моем сайте? & Quot; и именно по этой причине я указал на изменения и улучшения. Вы можете посмотреть на все другие ответы, которые они долго, поэтому я подумал, что я должен его обобщить. – Ani Menon 7 September 2016 в 15:23
  • 11
    Вместо того, чтобы показывать ссылку для своего решения, добавьте их здесь в качестве ответа. – amarnath 9 June 2017 в 07:07

Существует много причин, но, возможно, наиболее важным является то, что эти функции поощряют небезопасные методы программирования, поскольку они не поддерживают подготовленные заявления. Подготовленные утверждения помогают предотвратить атаки SQL-инъекций.

При использовании функций mysql_* вы должны помнить, чтобы запускать параметры, заданные пользователем, через mysql_real_escape_string(). Если вы забудете только в одном месте или если вам удастся избежать только части входа, ваша база данных может подвергаться атаке.

Использование подготовленных операторов в PDO или mysqli сделает так, чтобы эти типы ошибок программирования сложнее сделать.

87
ответ дан Trott 15 August 2018 в 20:23
поделиться
  • 1
    К сожалению, плохая поддержка MySQLi_ * для передачи переменного количества параметров (например, когда вы хотите передать список значений для проверки в предложении IN) поощряет неиспользование параметров, поощряя использование точно таких же конкатенированных запросов, которые оставить MySQL_ * вызовом уязвимым. – Kickstart 27 June 2013 в 10:31
  • 2
    Но, опять же, неуверенность не является неотъемлемой проблемой функций mysql_ *, а проблемой неправильного использования. – Agamemnus 2 February 2014 в 07:29
  • 3
    @Agamemnus Проблема в том, что mysql_ * упрощает реализацию этого «неправильного использования», особенно для неопытных программистов. Библиотеки, реализующие подготовленные инструкции, усложняют этот тип ошибок. – Trott 2 February 2014 в 18:33
Функции

mysql_ * были обесценены (как и php 5.5), учитывая тот факт, что были разработаны лучшие функции и структуры кода. Тот факт, что функция была обесценена, означает, что больше не будет сделано усилий для ее улучшения с точки зрения производительности и безопасности, что означает, что она менее надежна для будущего.

Если вам нужно больше причин:

  • mysql_ * функции не поддерживают подготовленные операторы.
  • mysql_ * функции не поддерживают привязку параметров.
  • mysql_ * функции не имеют функциональности для объектно-ориентированного программирования.
  • список продолжается ...
-7
ответ дан Webeng 15 August 2018 в 20:23
поделиться
  • 1
    Этот ответ устарел. Кроме того, он не добавляет ничего полезного в ответы, которые уже существуют. – Your Common Sense 24 May 2016 в 06:22
201
ответ дан Community 5 September 2018 в 19:40
поделиться
281
ответ дан Nae 5 September 2018 в 19:40
поделиться
284
ответ дан Nae 29 October 2018 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: