-1

テーブルからデータを取得しようとすると、何らかの理由で構文エラーが発生します...

私がどこで間違っているのか誰にもわかりますか?

    $cid = $_GET['id']; 

    $username = 'liam';
    $password ='';  

try {
$conn = new PDO('mysql:host=localhost;dbname=', $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $conn->query('SELECT * FROM directory WHERE ID = :cid');
$data->bindValue(":cid", $cid);

foreach($data as $row) {


    print_r($row). '<br />';
}

エラー

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

5 に答える 5

1
$data = $conn->query('SELECT * FROM directory WHERE ID = :cid');
$data->bindValue(":cid", $cid);

DBにクエリを実行する前に変数をバインドする必要があります。

マニュアルhttp://php.net/manual/en/pdostatement.bindparam.phpの例を見てください

于 2013-01-06T17:58:33.190 に答える
1

クエリを準備する代わりに実行しています。

変化する

$conn->query

$conn->prepare

query()特定のクエリをそのまま実行するだけです。prepare()プリペアドステートメントをデータベースに送信します。その後、バインドされたパラメータを使用して実行できます。

また、MySQLドライバーをPDOで使用しているようです。MySQLを使用する場合は、エミュレートされたプリペアドステートメントを無効にする必要があります。

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

詳細については、「 PHPでSQLインジェクションを防ぐにはどうすればよいですか?」を参照してください。

于 2013-01-06T17:59:12.217 に答える
1

これを使用してみてください:

$data = $conn->prepare('SELECT * FROM directory WHERE ID = :cid');
$data->bindValue(":cid", $cid);

prepare()ではなくの使用に注意してくださいquery()

于 2013-01-06T17:59:28.583 に答える
1
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_CHARSET', 'UTF-8');
define('DB_DATABASE', 'database');
define('PDO_DSN', 'mysql:host=' . DB_SERVER . ';dbname=' . DB_DATABASE . ';charset=' .
DB_CHARSET);

try {

$db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND 
=> "SET NAMES UTF8"));
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

/*** echo a message saying we have connected ***/

}
catch(PDOException $e)
{
echo $e->getMessage();
}

テーブル内のIDが大文字であることを確認してください!!

$data = $db->prepare('SELECT * FROM directory WHERE ID = :cid');

たぶん、ここでは bindValue() の代わりに bindParam を使用します

$data->bindValue(':cid', $cid);
$data->execute();
$result = $data->fetchAll();

foreach($result as $row) {


print_r($row). '<br />';
}
于 2013-01-06T18:04:49.943 に答える
0

接続行にデータベース名が表示されていないかuse、スクリプトに句が表示されていません。

于 2013-01-06T18:00:57.490 に答える