2016-06-15 10 views
-2
try { 
$stmt = $db->query('SELECT title FROM never-ending-book'); 
while($row = $stmt->fetch()){ 
    echo '<div class="lev3">'.$row['title'].'</div>'; 
    } 
}catch(PDOException $e) { 
    echo $e->getMessage(); 
}; 

結果:試み - 構文エラーとキャッチ

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-ending-book' at line 1 

が構文エラーであり、なぜnever-ending-booknear'-ending-bookになっていますか?

+1

はバッククォートでテーブル名を入れて! – Jeff

+5

私はダッシュがSQLテーブル名で許可されていないと思う。そうでなければ算術式のように見えます。 –

答えて

3

あなたがMySQL Manualを表示するために起こる場合、それはことを教えてくれます:識別子は、内部的にUnicodeに変換され

  • ASCII:[0-9、AZ、AZ $ _](基本的なラテン文字、数字0〜引用符で囲まれていない識別子で

    • 使用できる文字:彼らは、これらの文字が含まれていてもよいです9、ドル、アンダースコア)

(私のB

そして、あなたのカラム/テーブル名をバッククォートで引用していないので、このステートメント(上記引用)が適用されます。

ソリューション:

はバッククォートであなたのテーブル名とカラム名を包む、および/または上記の仕様を当てはめるない文字を削除するためにそれらの名前を変更します。

MySQL Keywords and Reserved Words listingも慎重に読んでください。


  • この質問は、PHPのtry/catchブロックに問題を提起しません。

  • MySQLがエラーを述べたとき、前にSQLクエリの一部に引用符で囲まれた文字列を見て開始することを今後の参考のために知っておくと便利かもしれは、そうnear'-ending-booklook at the character(s) at or before '-ending-bookを意味します。 the documentationによると

2

:引用符で囲まれていない識別子で

使用できる文字:

  • ASCII:[0-9、AZ、AZ $ _](基本的なラテン文字、数字0 -9ドル、アンダースコア)

  • 拡張:U + 0080 ..メッセージが示すように、識別子が引用されていない限り、ハイフンがスキーマオブジェクト識別子では許可されていないU + FFFFので

​​
関連する問題