Предупреждение: mysqli_query() ожидает, что параметр 1 будет mysqli, null указан в

Я пытаюсь создать простую пользовательскую CMS, но я получаю сообщение об ошибке:

Предупреждение: mysqli_query() ожидает, что параметр 1 будет MySQLi, null указан в

Почему я получаю эту ошибку? Весь мой код уже MySQLi, и я использую два параметра, а не один.

$con=mysqli_connect("localhost","xxxx","xxxx","xxxxx");

//check connection
if (mysqli_connect_errno($con))
{
echo "Failed to connect to MySQL:" . mysqli_connect_error();
}

function getPosts() {
$query = mysqli_query($con,"SELECT * FROM Blog");
while($row = mysqli_fetch_array($query))
    {
        echo "<div class=\"blogsnippet\">";
        echo "<h4>" . $row['Title'] . "</h4>" . $row['SubHeading'];
        echo "</div>";
    }
}

Ответ 1

Как уже упоминалось в комментариях, это проблема определения. В частности, $con не входит в объем вашей функции getPosts.

Вы должны передать объект подключения в качестве зависимости, например

function getPosts(mysqli $con) {
    // etc

Я также очень рекомендую остановить выполнение, если ваше соединение завершится с ошибкой. Что-то вроде этого должно быть достаточно

$con=mysqli_connect("localhost","xxxx","xxxx","xxxxx");
if (mysqli_connect_errno()) {
    throw new Exception(mysqli_connect_error(), mysqli_connect_errno());
}

getPosts($con);

Ответ 2

используйте глобальную область действия на $con и поместите ее внутри своей функции getPosts() так.

function getPosts() {
global $con;
$query = mysqli_query($con,"SELECT * FROM Blog");
while($row = mysqli_fetch_array($query))
    {
        echo "<div class=\"blogsnippet\">";
        echo "<h4>" . $row['Title'] . "</h4>" . $row['SubHeading'];
        echo "</div>";
    }
}

Ответ 3

Функция getPosts(), кажется, ожидает, что $con будет глобальной, но вы не объявляете ее как таковой.

Многие программисты рассматривают лысые глобальные переменные как "запах кода". Альтернатива на другом конце шкалы - это всегда передавать ресурс соединения. Промежуток между ними - это однопользовательский вызов, который всегда возвращает один и тот же дескриптор ресурса.

Ответ 4

Рекомендовать использовать global $con; в теле функции.