PDO获取语句问题

时间:2013-02-18 12:03:47

标签: php mysql pdo

我有以下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

有人可以帮忙吗?

3 个答案:

答案 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']."'"

字符串总是需要引用它们。