У меня есть небольшая проблема, переходящая от 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');