web-dev-qa-db-fra.com

Attention: mysqli_query () s'attend à ce que le paramètre 1 soit mysqli, null donné dans

J'essaie de créer un simple CMS personnalisé, mais j'obtiens une erreur:

Avertissement: mysqli_query () s'attend à ce que le paramètre 1 soit MySQLi, null donné dans

Pourquoi est-ce que je reçois cette erreur? Tout mon code est déjà MySQLi et j'utilise deux paramètres, pas un.

$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>";
    }
}
12
Philip

Comme mentionné dans les commentaires, il s'agit d'une question de portée. Plus précisément, $con n'est pas inclus dans votre fonction getPosts.

Vous devez passer votre objet de connexion en tant que dépendance, par exemple

function getPosts(mysqli $con) {
    // etc

Je recommande également fortement d'arrêter l'exécution si votre connexion échoue. Quelque chose comme ça devrait suffire

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

getPosts($con);
23
Phil

utilisez la portée globale sur votre $ con et placez-la dans votre fonction 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>";
    }
}
6
user3169490

La fonction getPosts() semble s’attendre à ce que $con soit global, mais vous ne le déclarez pas comme tel. 

Beaucoup de programmeurs considèrent les variables globales chauves comme une "odeur de code". L'alternative à l'autre bout de l'échelle est de toujours faire passer la ressource de connexion. Partway entre les deux est un appel singleton qui renvoie toujours le même descripteur de ressource.

0
staticsan