警告:mysqli_query()期望参数1为mysqli,null为null

时间:2013-09-18 02:02:18

标签: php mysql mysqli

我正在尝试构建一个简单的自定义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>";
    }
}

3 个答案:

答案 0 :(得分:23)

正如评论中所提到的,这是一个范围问题。具体而言,$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);

答案 1 :(得分:7)

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

答案 2 :(得分:0)

getPosts()函数似乎期望$con是全局的,但您并未将其声明为全局。

许多程序员将秃顶全局变量视为“代码味道”。规模另一端的替代方案是始终传递连接资源。两者之间的中间是一个单独的调用,它总是返回相同的资源句柄。