web-dev-qa-db-ja.com

警告:mysqli_query()はパラメーター1がmysqliであると想定しています。

シンプルなカスタムCMSを構築しようとしていますが、エラーが発生しています:

警告:mysqli_query()はパラメーター1がMySQLiであると想定しています。

このエラーが発生するのはなぜですか?すべてのコードはすでにMySQLiであり、1つではなく2つのパラメーターを使用しています。

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

コメントで述べたように、これはスコープの問題です。具体的には、$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);
24
Phil

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

getPosts()関数は$conがグローバルであることを期待しているようですが、そのように宣言していません。

多くのプログラマーは、bげたグローバル変数を「コード臭」と見なしています。スケールのもう一方の端の代替手段は、常に接続リソースを渡すことです。 2つの中間には、常に同じリソースハンドルを返すシングルトンコールがあります。

0
staticsan