无法使用PHP / PDO从表中获取数据

时间:2013-01-06 17:53:41

标签: php mysql pdo

我试图从我的表中检索数据只是出于某些原因我收到语法错误...

任何人都可以看到我可能出错的地方吗?

    $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 

5 个答案:

答案 0 :(得分:1)

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

在查询DB之前必须绑定变量...

请查看手册http://php.net/manual/en/pdostatement.bindparam.php

上的示例

答案 1 :(得分:1)

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

更改

$conn->query

$conn->prepare

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

我也看到你正在使用带有PDO的MySQL驱动程序。使用MySQL时,您必须禁用模拟的预准备语句:

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

有关详细信息,请参阅:How can I prevent SQL injection in PHP?

答案 2 :(得分:1)

尝试使用:

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

请注意使用prepare()而不是query()

答案 3 :(得分: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 />';
}

答案 4 :(得分:0)

我没有在连接线中看到数据库名称,也没有在脚本中看到use子句。