質問

この質問の愚かさの可能性についてはご容赦ください。しかし、私は準備された文を使い始めたばかりです。この特定のクエリが機能することは、準備されていない手続き型メソッドでテストしたためです。ここにあります:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($content);
$stmt->fetch();
echo  $content;
$stmt->close();

正しい方向のアドバイスやポイントは大歓迎です!

編集1: トラブルシューティングを試みる際の進捗状況を更新します。セクションテーブルのインデックスとしてid列があるので、php.netで上記のステートメントを指定すると、結果としてそれもバインドする必要があることに気付きました(ありがとう、ビル)。

新しいコードは次のとおりです。

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($id, $name, $content);
$stmt->fetch();
echo $content;
$stmt->close();

提案を提供できるすべての人に感謝します。 (好奇心が強い:OOPスタイルのプリペアドステートメントをこのように使用すると、デバッグするのが難しくなります。たとえば、実際に使用されたクエリを簡単に確認する簡単な方法はありますか?)

編集2: こんにちは、テストを行ってくれてありがとう、本当に感謝しています。私も今しばらく頭を悩ませてきたので、あなたが聞かざるを得ない質問を理解しています。私はそれが存在すると言う必要があります。

ちょっとした例として、次のことを行う場合:

$name = 'introduction';
@mysql_connect('host', 'user', 'pass');
@mysql_select_db('db');
$query = "SELECT name,content FROM sections WHERE name = '$name'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
    $content = $row->content;
    echo $content;
}

私のデータが表示され、すべてが順調です。ただし、次の場合:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($name, $content);
$stmt->fetch();
echo  $content;
$stmt->close();

正しいと思う(もちろん、そうでない場合は大声でお気軽に)、何も得られません。さらに、そのコードでは、HTML検証(念のため)を行うと、内部サーバー警告(500)が表示されますが、これはSQLコードの問題と見なされます。私はただのナッツですか?

継続的な支援に感謝します、非常に感謝しています!

編集3: まあ、私は馬鹿のように感じますが、私はそれを修正しました、そしてビル、あなたの質問は正しかったです。いったいどうやって間違ったデータベースの詳細を入力し、長い間見逃していたのか、私にはわかりませんが、まさにそれが起こったのです。

忍耐と助けてくれてありがとう。

役に立ちましたか?

解決

ステートメントの準備やパラメーターの使用に問題はありませんが、バインド結果に問題があります:

http://php.net/manual/en/mysqli -stmt.bind-result.php のコメント:

  

すべての列をバインドする必要があることに注意してください    mysqli_stmt_execute()の後および前    mysqli_stmt_fetch()を呼び出します。

(強調鉱山)


上記のドキュメントは、テーブルのすべての列ではなく、クエリのすべての列として取得する必要があります。

さて、私は自分でこれを試しました。 $ name 列を省略すると、次の警告が表示されます。

PHP Warning:  mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9
PHP Stack trace:
PHP   1. {main}() /Users/bill/workspace/PHP/mysqli.php:0
PHP   2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9

ただし、データはフェッチされます。

クエリの結果に $ name $ content の両方をバインドすると、エラーまたは警告なしで機能します。

だから私はあなたに尋ねざるを得ません:あなたはあなたの条件に一致するデータベースの行がありますか?つまり、 name = 'introduction' はどこですか? SQLでは、文字列比較ではデフォルトで大文字と小文字が区別されることに注意してください。

人々がよく見かける間違いの1つは、アドホッククエリに使用するデータベースとは異なるPHPスクリプトの別のデータベースに接続することです。そのため、データが適切なデータベースに存在することを確実に確認する必要があります。

他のヒント

そうではない

$stmt->bind_result($name, $content);

2つの列を選択すると

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top