我试图从我的表中检索数据只是出于某些原因我收到语法错误...
任何人都可以看到我可能出错的地方吗?
$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
答案 0 :(得分:1)
$data = $conn->query('SELECT * FROM directory WHERE ID = :cid');
$data->bindValue(":cid", $cid);
在查询DB之前必须绑定变量...
上的示例答案 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
子句。