0

我的簿记应用程序有以下 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

有人可以帮忙吗?

4

3 回答 3

2

有几件事:

1) 不要插入原始查询字符串:
此代码极易受到 SQL 注入的影响。PDO 有一个称为“准备好的语句”的功能。这是你应该为你的 SQL 查询使用的 waht。不要只在查询字符串中注入一些 POST 参数,因为结果将是一个安全漏洞。您意外插入到查询中的引号很可能来自尝试 SQL 攻击的恶意用户。

2)
缺少空格:在 AND 之前有一个空格。解析器不知道如何理解术语 2AND,因此会产生错误。itemslf 的 SQL 扩展为类似的东西。

SELECT data FROM teach_books where lesson=2AND page=24;

3) 缺少引号:
如果您要使用上述内容,则需要在查询末尾添加一些右引号。您还需要在选择中提供的字符串参数周围加上引号。

4)ECHO DATA:
你实际上并没有在循环中打印出任何东西。简单地在 PHP 中放置一个语句不会将其打印出来。你需要 echo 命令。

echo $results['data'];

5) 迭代对象:
您不需要继续调用 fetch(),您可以使用 fetchAll() 然后迭代该结果集。实际上,除非您只需要数组中的行,否则您不应该调用任何“获取”方法。结果集对象是可迭代的并且可以循环。

$statement->execute(); 
foreach ($statement as $row) { 
    ... 
}  

6) TRY-CATCH:
您可能会删除“try-catch”代码,因为您在里面所做的事情就是异常会做的事情。

此外,我希望“管理员”不是您的实际密码。

很抱歉一直在补充我的答案。只是想自己发布 6 点,然后对其进行扩展。

希望有帮助

于 2013-02-18T12:06:56.957 回答
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']."'"

字符串总是需要引号。

于 2013-02-18T12:06:51.323 回答
0

你的SQL错了,试试看:

$statement=$DB->query("SELECT data FROM teach_books where lesson='".$_POST['lesson']."'AND page='".$_POST['page']."'" );

您正在比较字符串值,因此您需要在 sql 查询中使用 '' 。

于 2013-02-18T12:06:35.343 回答