Call to undefined function mysql real escape string php

mysql_real_escape_string не определен

Я использую PHP версии 5.3 и пытаюсь использовать mysql_real_escape_string($unescaped_string) в моем коде, но я получаю сообщение об ошибке:

Fatal error: Call to undefined function mysql_real_escape_string() in /var/www/engine/database.php on line 38 

Однако я все еще могу подключиться к базе данных. Почему он недоступен?

Я использую PHP версии 5.3.

Пожалуйста, покажите нам свой код — GBD

Вместо этого попробуйте mysql_escape_string() — jtheman

@jtheman, почему вы предлагаете заменить лучшую функцию (которая учитывает конфигурацию сервера) худшей функцией (просто заменить строку)? — Vyktor

Как вы узнали, что вы можете получить базу данных — Rohit Choudhary

mysql_real_escape_string() был создан, потому что mysql_escape_string() имеет уязвимости, настоятельно рекомендую не использовать его! — Boštjan Pišler

5 ответы

Обновление ПО как упомянуто в комментарий, mysql_ было устарело с 5.5:

Расширение mysql устарело, начиная с PHP 5.5. Вместо этого следует использовать расширение mysqli или PDO. Решение об устаревании было принято в mysql_deprecation, где можно найти обсуждение причин этого решения.

и удалено в PHP 7.

mysql_real_escape_string() является стандартной частью Функция MySQL «пакет» и всегда должно работать, если расширение загружено правильно.

Любая другая mysql_ функция работает? (Не должно)

Убедитесь, что эта строка раскомментирована в вашем php.ini :

Также было бы разумно использовать mysqli or PDO вместо ( mysql_ устарела), они оба могут позаботиться о побеге вместо вас.

Извините, этот вопрос был моей ошибкой. Когда я использовал sudo apt-get install php5-mysql, это не удалось, и я подумал, что мой другой оператор подключения работает правильно. Я думаю, вы только что получили бесплатный правильный ответ. — Майкл Х

@MichaelH требуется некоторая практика, чтобы сначала проверить конфигурацию системы (после обновления), прежде чем задаваться вопросом, что не так с вашим кодом. — Виктор

Расширение MySQL недоступно с PHP 5.5; вместо этого используйте ext/mysqli или ext/pdo_mysql. — Кристоффер Боманн

В моем случае я использовал mysqli_real_escape_string вместо mysql_real_escape_string .

Интересно, что после изучения всех других решений здесь я понял, что проблема на самом деле связана с php5-mysql расширение еще не было установлено — оно не установлено по умолчанию на новой Ubuntu, ни когда вы устанавливаете свежий php. Итак, для меня решением стало: установить расширение php5-mysql:

sudo apt-get install php5-mysql 

После этого я больше не получал этих неприятных ошибок mysql_* 😉

Возможно, ваша проблема связана с конфигурацией php-сервера (компиляция).

Расширение MySQL устарело, начиная с PHP 5.5. Таким образом, функция mysql_real_escape_string() недоступна в PHP 7. Это означает, что пользовательский ввод не может быть корректно экранирован, и код остается открытым для атак путем внедрения кода SQL.

Официальное PHP-решение состоит в том, чтобы заменить ext/mysql на MySQLi, PDO или другое поддерживаемое расширение базы данных.

Для предотвращения атак SQL-инъекций рекомендуется использовать подготовленные операторы и параметризованные запросы при общении с базой данных.

Любой доступный API базы данных (mysql, mysqli, PDO, что угодно) имеет функцию для правильного экранирования значений или прямого использования API подготовленного оператора базы данных (для начала гораздо лучший подход). Если real_escape_string или эквивалент недоступен, что означает, что весь API базы данных недоступен, и у вас в любом случае есть гораздо более серьезные проблемы. Никогда не должно быть необходимости плохо переопределять эту функцию. Критически вы не реализуете никаких проблем с кодировкой, что по-прежнему оставляет вас открытым для внедрения в определенные многобайтовые кодировки. — обманывать

@deceze: ответ изменен, чтобы сосредоточиться на части «расширение MySQL устарело». Удалена функция, имитирующая mysql_real_escape_string() . — Кристоффер Боманн

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками php mysql ubuntu or задайте свой вопрос.

Источник

Переход битрикс на php7

14.07

Как перевести сайт на Битриксе на новую версию php7. Решение с ошибками mysql

Вышел php7 и многие заявляют, что производительность 1С-Bitrix на этой версии php возросла.
Но если обновить php, то сайт перестанет работать.

Так же если вы развернули сайт несколько лет назад, ещё на Битрикс машине, например, CentOS-6-amd64-bitrix, то на большинстве хостингов уже нет возможности установить CentOS-6, есть только Битрикс машина CentOS-7. Но если развернуть бекап на свежей битрикс машине сайт снова не заработает.

Будет получен следующий набор ошибок при попытке открыть сайт:

[Error] Call to undefined function Bitrix\Main\DB\mysql_real_escape_string() (0) /home/bitrix/www/bitrix/modules/main/lib/db/mysqlsqlhelper.php:21 #0: Bitrix\Main\DB\MysqlSqlHelper->forSql(string) /home/bitrix/www/bitrix/modules/main/lib/db/sqlexpression.php:111 #1: Bitrix\Main\DB\SqlExpression->execPlaceholders(array) #2: preg_replace_callback(string, array, string) /home/bitrix/www/bitrix/modules/main/lib/db/sqlexpression.php:68 #3: Bitrix\Main\DB\SqlExpression->compile() /home/bitrix/www/bitrix/modules/main/classes/general/usertype.php:2913 #4: CAllSQLWhere->_ExprEQ(string, object) /home/bitrix/www/bitrix/modules/main/classes/general/usertype.php:3557 #5: CAllSQLWhere->addStringFilter(array, boolean, string, string, object) /home/bitrix/www/bitrix/modules/main/classes/general/usertype.php:3216 #6: CAllSQLWhere->GetQueryEx(array, array) /home/bitrix/www/bitrix/modules/main/classes/general/usertype.php:3101 #7: CAllSQLWhere->GetQuery(array) /home/bitrix/www/bitrix/modules/main/lib/entity/query.php:1119 #8: Bitrix\Main\Entity\Query->buildJoin() /home/bitrix/www/bitrix/modules/main/lib/entity/query.php:1297 #9: Bitrix\Main\Entity\Query->buildQuery() /home/bitrix/www/bitrix/modules/main/lib/entity/query.php:486 #10: Bitrix\Main\Entity\Query->exec() /home/bitrix/www/bitrix/modules/main/lib/entity/datamanager.php:256 #11: Bitrix\Main\Entity\DataManager::getList(array) /home/bitrix/www/bitrix/modules/highloadblock/admin/menu.php:14 #12: include(string) /home/bitrix/www/bitrix/modules/main/interface/admin_lib.php:640 #13: CAdminMenu->_IncludeMenu(string) /home/bitrix/www/bitrix/modules/main/interface/admin_lib.php:418 #14: CAdminMenu->Init(array) /home/bitrix/www/bitrix/modules/main/interface/prolog_main_admin.php:30 #15: require_once(string) /home/bitrix/www/bitrix/modules/main/include/prolog_admin_after.php:15 #16: require(string) /home/bitrix/www/bitrix/modules/main/admin/update_system.php:31 #17: require_once(string) /home/bitrix/www/bitrix/admin/update_system.php:2

Или другие вариантов ошибок с подключением к Базе данных

Все дело в том, что в php7 произошел переход на Mysqli. И чтобы заработал сайт, достаточно внести настройки в 2 файла движка Битрикс.

В файл /bitrix/php_interface/dbconn.php
Добавить: define(«BX_USE_MYSQLI», true);

И в файл: /bitrix/.settings.php
Исправить строку: ‘className’ => ‘\\Bitrix\\Main\\DB\\MysqlConnection’, на ‘className’ => ‘\\Bitrix\\Main\\DB\\MysqliConnection’,

И ваш сайт на Битрикс будет работать на php7!

Источник

mysql_real_escape_string не определена

Я использую PHP версии 5.3 и пытаюсь использовать mysql_real_escape_string($unescaped_string) в своем коде, но получаю ошибку:

Fatal error: Call to undefined function mysql_real_escape_string() in /var/www/engine/database.php on line 38 

@jtheman, почему вы предлагаете заменить лучшую функцию (которая учитывает конфигурацию сервера) на худшую функцию (просто простая замена строки)?

@Vyktor Конечно, лучше. Но он не уверен, что пользователь может изменить конфигурацию своего сервера.

mysql_real_escape_string () был создан, потому что mysql_escape_string () имеет уязвимости, настоятельно рекомендуем не использовать его!

Проблема с mysql_real_escape_string() заключается в том, что для определения набора символов требуется соединение с БД. К сожалению, вы могли бы очень хорошо иметь программу, которая должна экранировать строки, но не имеет способа получить соединение с БД (например, программа, которая создает файл в операторах INSERT, который затем переносится на машину БД для последующего действия. ).

4 ответа

Обновить, как указано в comment, mysql_ было устарел с версии 5.5:

Расширение mysql устарело с PHP 5.5. Вместо этого следует использовать расширение mysqli или PDO. Отклонение было принято в mysql_deprecation, где можно найти обсуждение причин этого решения.

и удалены в PHP 7.

mysql_real_escape_string() является стандартной частью MySQL «batch» и всегда должна работать, если расширение загружено правильно.

Работает ли какая-либо другая функция mysql_ ? (Это не должно быть)

Удостоверьтесь, что у вас эта строка раскомментирована в php.ini :

Также было бы разумно использовать mysqli или PDO вместо этого ( mysql_ устарел), они оба могут позаботиться о побеге для вас.

Извините, этот вопрос был моей ошибкой. Когда я использовал sudo apt-get install php5-mysql, это не удалось, и я подумал, что мой другой оператор connect работает правильно. Я думаю, вы только что получили свободный правильный ответ.

@MichaelH Сначала нужно проверить конфигурацию системы (после обновления), прежде чем задуматься, что не так с вашим кодом.

Интересно, что после изучения всех других решений здесь я понял, что проблема связана с тем, что расширение php5-mysql еще не установлено — оно не установлено по умолчанию на новом Ubuntu, ни при установке новой php. Итак, для меня решение стало: установить расширение php5-mysql:

sudo apt-get install php5-mysql 

После этого я не получал эти неприятные ошибки mysql_ *, -)

Расширение MySQL устарело с PHP 5.5. Поэтому mysql_real_escape_string() недоступен в PHP 7. Это означает, что пользовательский ввод не может быть экранирован правильно и оставляет код открытым для SQL-инъекций.

Официальное решение PHP для заменить ext/mysql на MySQLi, PDO или другое поддерживаемое расширение базы данных.

Чтобы предотвратить атаки SQL-инъекций, рекомендуется использовать подготовленные инструкции и параметризованные запросы при разговоре с базой данных.

Любой доступный API базы данных (mysql, mysqli, PDO и т. Д.) Имеет функцию для правильного экранирования значений или непосредственного использования подготовленного API-интерфейса оператора базы данных (гораздо лучший подход для начала). Если real_escape_string или его эквивалент недоступен, это означает, что весь API базы данных недоступен, и у вас все равно будут гораздо большие проблемы. Никогда не должно быть необходимости плохо реализовывать эту функцию. Критически, вы не реализуете какие-либо проблемы с кодировкой, что все еще оставляет вас открытыми для внедрения в определенных многобайтовых кодировках.

@deceze: Ответ изменен, чтобы сосредоточиться на части «Расширение MySQL устарело». Удалена функция, которая имитирует mysql_real_escape_string() .

Источник

Читайте также:  Php not save cookie
Оцените статью