-2
<?php
$config['db'] = array (
'host'                      =>  'localhost',
'username'                  =>  'root',
'password'                  =>  '',
'dbname'                    =>  'pdologin'
);

$db = new PDO("mysql:host={$config['db']['host']};dbname={$config['db']['dbname']}",
      $config['db']['username'], $config['db']['password']);
$query = $db->query("SELECT * 'firstname' FROM 'login'");
while ($row = $query->fetch(PDO::FETCH_ASSOC)){
echo $row['firstname'], '<br>';
 }
?>

コードを実行すると、「致命的なエラー: 12 行目の C:\webroot\wamp\www\index.php の非オブジェクトでメンバー関数 fetch() を呼び出します」というエラーが表示されます。

何がエラーになっていますか?私が考えることができる唯一のものは、SQLクエリです。

4

1 に答える 1

0

この SQL クエリには 2 つの構文エラーがあります。

$query = $db->query("SELECT * 'firstname' FROM 'login'");

FROM 句で文字列リテラルをテーブルとして使用することはできません。

説明: さまざまなタイプの引用符は、SQL でさまざまなことを行います。

  • 単一引用符は、常に文字列リテラルまたは日付リテラルの区切り文字です。
  • MySQL では、バックティックはテーブル識別子 (および列やその他のメタデータ オブジェクト) の区切り記号です。
  • 二重引用符は、標準 SQL およびSQL_MODE=ANSI_QUOTESを設定した場合の MySQL のテーブル識別子の区切り文字です。ただし、MySQL のデフォルトでは、二重引用符は単一引用符と同じであり、文字列と日付を区切ります。

また'firstname'、クエリに無効な場所がありました。列に名前を付けるつもりだったのか (もしそうなら、引用符の型をまた間違えていた)、それが列のエイリアスであることを意味していたのか (もしそうなら、あなたは alias できません*。単一の特定の列に別名を付けます)。

したがって、クエリは次のようになります。

$query = $db->query("SELECT * FROM `login`");

$queryスクリプトのもう 1 つの間違いは、PDOStatement メソッドを呼び出す前に、それが PDOStatement 型のオブジェクトであることを確認していないことです。PDO::query() はfalse、SQL にエラーがあった場合に戻ります。 falseはオブジェクトではなくプリミティブ値であるため、当然、呼び出すことができるメソッドはありません。したがって、戻り値を使用して何かを行う前に、常に戻り値を確認する必要があります。

例えば:

$query = $db->query("SELECT * FROM `login`");
if ($query === false) {
  die(print_r($db->errorInfo(), true));
}
于 2013-01-16T03:24:55.350 に答える