シンプルなカスタム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>";
}
}
コメントで述べたように、これはスコープの問題です。具体的には、$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);
$ 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
がグローバルであることを期待しているようですが、そのように宣言していません。
多くのプログラマーは、bげたグローバル変数を「コード臭」と見なしています。スケールのもう一方の端の代替手段は、常に接続リソースを渡すことです。 2つの中間には、常に同じリソースハンドルを返すシングルトンコールがあります。