警告:mysqli_query()期望参数1是mysqli,null中给出

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

正如评论中提到的,这是一个范围问题。 具体而言, $con不在getPosts函数的范围内。

你应该传递你的连接对象作为依赖,例如

 function getPosts(mysqli $con) { // etc 

如果连接失败,我也强烈build议停止执行。 像这样的东西应该足够了

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

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

getPosts()函数似乎希望$con是全局的,但是你并不是这样声明的。

很多程序员把秃顶的全局variables看作是“代码味道”。 规模另一端的替代方法是始终传递连接资源。 两者之间的一个单独的调用总是返回相同的资源句柄。

build议使用global $con; 在function体内。