-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);

您必须在查询数据库之前绑定变量...

看看手册上的例子http://php.net/manual/en/pdostatement.bindparam.php

于 2013-01-06T17:58:33.190 回答
1

您正在运行查询而不是准备它。

改变

$conn->query

$conn->prepare

query()只需按原样运行给定的查询。prepare()将准备好的语句发送到您的数据库,之后可以使用绑定参数运行它。

我还看到您正在使用带有 PDO 的 MySQL 驱动程序。使用 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');

也许在这里我会使用 bindParam 而不是 bindValue()

$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 回答