Intereting Posts
непрерывный цикл через массив PHP (или объектные ключи) Почему CIUnit необходим для использования PHPUnit с CodeIgniter? Черты с PHP и Laravel Использовать регулярные выражения для проверки паролей Проверить имя пользователя существует с помощью PHP и PDO? Не избегайте html, хранящегося в виде строки (выполнить или обработать html-строку) Почему этот массив не работает так, как ожидалось? java регулярное выражение для комментария php Как запустить сценарий оболочки как другой пользователь с PHP на Nginx? Конвертирование PDF в JPG с использованием PHP Новое сообщение в Facebook не отображает связанные изображения SELECT пользователей из базы данных MySQL с помощью привилегий bitmask? Как запретить прямой доступ к файлам в каталоге AJAX Лучшие практики, позволяющие моим веб-пользователям загружать пользовательский .exe с моего сайта с помощью PHP Временные интервалы PHP

Должен ли я передавать переменную $ mysqli для каждой функции?

У меня есть небольшая проблема, переходящая от mysql_ * к объектно-ориентированной mysqli.

Мой файл index.php структурирован как включающий два файла:

include('connect.php'); include('function.php'); 

Файл connect.php содержит:

 <?php $mysqli = new mysqli("localhost", "root", "test", "test"); if (mysqli_connect_errno($mysqli)) { printf("Connection failed: %s\n", mysqli_connect_error()); exit(); } ?> 

В файле function.php есть функция, называемая showPage, которая не принимает аргументов, но использует соединение $ mysqli , в строках вроде …

 $result = $mysqli -> query("SELECT * FROM $table ORDER BY ID DESC"); // Seleziono tutto il contenuto della tabella 

Я не могу справиться с этим, не переходя к функции переменной $ mysqli , но это не было необходимо, когда я использовал mysql_ * устаревшие функции!

Могу ли я понять, почему, и как лучше всего это решить?

Пользовательские функции имеют собственную область переменных в PHP. Вам нужно передать $mysqli в функцию в качестве параметра или запустить функцию с global $mysqli .

Эта точная проблема приведена в качестве примера на странице с областью переменных :

Однако в пользовательских функциях вводится локальная функция. Любая переменная, используемая внутри функции, по умолчанию ограничена областью локальных функций. Например, этот скрипт не будет выводить какой-либо вывод, потому что оператор echo ссылается на локальную версию переменной $ a, и ей не присваивается значение в этой области. Вы можете заметить, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны для функций, если они не переопределены локальным определением. Это может вызвать некоторые проблемы в том, что люди могут непреднамеренно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены глобальными внутри функции, если они будут использоваться в этой функции.

 <?php $a = 1; /* global scope */ function test() { echo $a; /* reference to local scope variable */ } test(); ?> 

После лучшего поиска я нашел свой ответ, это для тех, кто может понадобиться:

PHP меняется на mysqli. Является ли mysqli_connection не глобальным?

Это был ответ, который мне нужен. Спасибо всем, кто помог мне

не может управлять им, чтобы работать, не переходя к функции переменной $ mysqli , но это не было необходимо, когда я использовал mysql_ * устаревшие функции!

Это не совсем правильно. Даже в старой функции mysql_* вам действительно нужно было передать идентификатор ссылки, если вам нужно указать, к какому соединению базы данных вы относились, например:

 $result = mysql_query($sql, $link); 

Также, что показывает этот пример, вам пришлось пройти и по $result . Если вы не $link параметр $link :

 $result = mysql_query($sql); 

Расширение mysql действительно выглядело внутренне для последнего использованного соединения. Если бы ни один не был найден, он создал новый с параметрами, установленными в php.ini. Это просто для вашей информации, чтобы лучше понять, почему и как это сработало в прошлом.

Вы также можете использовать пул соединений, стоит проверить это .

 $mysqli = new mysqli('p:localhost', 'username', 'password', 'db_name');