我有以下PHP用于我的簿记应用程序。它使用PDO。
if (isset($_POST['lesson'])AND isset($_POST['page']))
{
try {
$options_pdo[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION ;
$DB= new PDO('mysql:host=localhost;dbname=mydb','jamie','admin',$options_pdo);
$statement=$DB->query("SELECT data FROM teach_books where lesson=".$_POST['lesson']."AND page=".$_POST['page'] );
while($results = $statement->fetch()){
$results['data'];
echo "<br>";
}
} catch(Exception $e) {
die ('ERROR: '.$e->getMessage());
exit;
}
}
但是,当我运行代码时,它会显示以下错误:
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 'page=dsas' at line 1
有人可以帮忙吗?
答案 0 :(得分:2)
有几件事:
1)不要插入原始查询字符串:
这段代码对SQL注入非常有用。 PDO有一个名为“预备语句”的功能。这是你应该用于SQL查询。不要只是将一些POST参数注入查询字符串,因为结果将是一个安全漏洞。您意外插入查询的引号可能来自尝试SQL攻击的恶意用户。
2)缺少空间:
在AND之前你有一个缺失的空间。解析器不知道如何使用术语2AND,因此产生错误。 iteslf的SQL扩展为类似的东西。
SELECT data FROM teach_books where lesson=2AND page=24;
3)缺少引号: 如果您要使用上述内容,则需要在查询末尾添加一些结束引号。您还需要在select中提供的字符串参数周围的引号。
4)ECHO DATA:
你实际上并没有在循环中打印任何东西。只需在PHP中放置一个语句就不会打印出来。你需要echo命令。
echo $results['data'];
5)在对象上进行迭代:
您不需要继续调用fetch(),您可以使用fetchAll()然后迭代该结果集。
实际上你不应该调用任何“fetch”方法,除非你只需要数组中的行。
结果集对象是可迭代的,可以循环。
$statement->execute();
foreach ($statement as $row) {
...
}
6)TRY-CATCH:
你可以删除'try-catch'代码,因为你在里面做的是异常会做什么。
此外,我希望'admin'不是您的实际密码。
很抱歉继续添加我的回答。只是想自己发布6分,然后扩展它们。
希望有所帮助
答案 1 :(得分:0)
你的SQL错了,试一试:
$statement=$DB->query("SELECT data FROM teach_books where lesson='".$_POST['lesson']."'AND page='".$_POST['page']."'" );
您要比较字符串值,因此您需要在sql查询上使用''。
答案 2 :(得分:0)
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 'page=dsas' at line 1
问题可能是因为您没有为值添加引号:
".... page='".$_POST['page']."'"
字符串总是需要引用它们。