2016-11-11 2 views
-1

Я довольно новичок в программировании и должен сделать сайт совместимым с php7. Я не хочу менять код, поэтому мне нужно изменить старый устаревший (и больше не работает) mysql_ для новичков mysqli_ db-connection.переменная from required_once() не определена, но работает с require(), почему?

До сих пор все работает очень хорошо, но в нескольких сценариях у меня проблема с require_once db-connection-script, она включена в начало скрипта и работает хорошо, но в «функции» в том же скрипте включая db-connection-file, и его переменные не могут использоваться даже тогда, когда я снова включу его "include_once".

Но если я просто включил(), он снова работает. Мой вопрос: почему? Поскольку я понял, что он включает в себя файл несколько раз без «include_once», это может вызвать проблемы, поэтому мне действительно нужна помощь в понимании этой проблемы.

index.php:

<?php 
require_once('../../Connections/db.php'); 
mysqli_select_db($dbcon, $dbname); 
$query = "SELECT x, y FROM dbtable WHERE z"; 

работает хорошо, но в том же файле:

function pruefe_datum($datum){ 

if (!function_exists("GetSQLValueString")) { 
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { 
require_once('../../Connections/db.php'); 
$theValue = mysqli_escape_string($dbcon, $theValue); 
} } } 

Броски:

Извещение: Undefined переменной: dbcon и предупреждения: mysqli_escape_string() ожидает, что параметр 1 будет mysqli, null присвоен

+0

Используете ли вы 'require_once ('../../ Connections/db.php');' дважды в одном файле? – Abhishek

+0

Вы забыли показать инициализацию переменной '$ dbcon' –

+3

Что, по-вашему, означает бит' _once'? –

ответ

-1

Предполагая, что вы не закрыть соединение DB перед этой функции должно работать:

function pruefe_datum($datum){ 
    if (!function_exists("GetSQLValueString")) { 
     function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { 
      global $dbcon; 
      $theValue = mysqli_escape_string($dbcon, $theValue); 
     } 
    } 
} 

Это проблема с объемом. Переменная $ dbcon не существует внутри функции, а вторая require_once игнорируется и не требуется.

+0

Да, я думаю, это лучший способ решить эту проблему. Я знаю, что некоторые другие здесь заявили об объеме проблемы и благодаря им всем! Как я уже сказал, я все еще учусь. И более старый метод «mysql _» не обязательно нуждался в соединении, переданном ему, он просто взял последний доступный или попытался открыть новый, но метод «mysqli _» хочет, чтобы соединение было передано как параметр, чтобы это казалось причина, по которой она работала со старым «mysql_», но не с моими изменениями в «mysqli_». Большое спасибо! – Rocktale

+0

@ Rocktale NO. Использование 'global' - плохая идея для такого рода построения кода. Он сочетает в себе два значения (функция и база данных var) слишком близко и может легко вызывать проблемы сложности по линии. [подробнее о том, почему] (http://stackoverflow.com/q/130878/3536236). Этот ответ varlogtim - не лучшая практика. [Подробнее здесь] (http://stackoverflow.com/q/1557787/3536236) – Martin

+0

@Martin Хорошо, я понимаю, что это может вызвать проблемы с установкой глобальных варов, спасибо за ссылки. Что я до сих пор не понимаю, что еще я могу сделать, чтобы решить мою проблему? Как уже было сказано, я не хочу менять код, который мне нужен, но я также хочу, чтобы он работал, а также хочу узнать, как все считается правильным. Итак, следует ли передавать переменную соединения в качестве параметра для каждой функции, где она мне нужна, а не объявлять ее глобальной? Или что еще я могу сделать? – Rocktale

1

Вы используете require_once ('../../ Connections/db.php');

вне функции. Таким образом, Connections/db.php уже включен и, следовательно, недоступен внутри функции, даже если вы включили его снова на require_once.

См difference

Решение: удалите второй требует вызов и вместо того, чтобы передать переменную в функцию: GetSQLValueString($theValue, $dbcon, ....)

+1

so * a * решение было бы удалить второй запрос на вызов и вместо этого передать переменную в функцию: 'GetSQLValueString ($ theValue, $ dbcon, ....)' – Martin

+0

@Martin Исправить. Включая его в ответ. Благодарю. – Abhishek

+0

Да, он включен вне функции, но почему теперь не доступно соединение внутри функции? Я имею в виду, что весь скрипт работал со старым mysql, но не с mysqli. – Rocktale

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