我的簿记应用程序有下面的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
有人能帮忙吗?
两件事:
1)不要插入原始查询字符串:
此代码对SQL注入极易接受。PDO有一个叫做"准备好的语句"的功能。这是您应该用于SQL查询的内容。不要只是将一些POST参数注入到查询字符串中,因为结果将是一个安全漏洞。您在查询中意外插入的引号很可能来自试图进行SQL攻击的恶意用户。
2)缺少空间:
"与"前面缺少一个空格。解析器不知道如何理解术语2AND,因此会产生错误。iteslf的SQL扩展到类似的内容。
SELECT data FROM teach_books where lesson=2AND page=24;
3)缺少引号:
如果要使用类似于上面的内容,则需要在查询末尾添加一些右引号。您还需要在select中给出的字符串params周围加引号。
4)ECHO数据:
您实际上并没有打印出循环中的任何内容。简单地将一个语句放在PHP中是不会打印出来的。您需要echo命令。
echo $results['data'];
5)迭代对象:
您不需要一直调用fetch(),您可以使用fetchAll(),然后迭代该结果集。实际上,除非只需要数组中的行,否则不应该调用任何"fetch"方法。结果集对象是可迭代的,并且可以循环使用。
$statement->execute();
foreach ($statement as $row) {
...
}
6)TRY-CATCH:
您可能会删除"try-catch"代码,因为您在其中所做的就是异常无论如何都会做的事情。
此外,我希望"admin"不是您的实际密码。
很抱歉一直在添加我的答案。只是想自己拿下6分,然后再进一步。
希望对有所帮助
您的SQL错误,请尝试:
$statement=$DB->query("SELECT data FROM teach_books where lesson='".$_POST['lesson']."'AND page='".$_POST['page']."'" );
您正在比较字符串值,因此需要在sql查询中使用"。
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']."'"
字符串周围总是需要引号。