2015-04-28 137 views
4

好吧,所以我是新的PDO语句,所以我不确定是否我做了语法错误或whatnot。 PHP文件不显示任何错误:PDO查询不显示结果?

<?php 
    include('db_config.php'); 
    $itemName = 'Item1'; 

    $sql = "SELECT * FROM order WHERE itemName = $itemName;"; 
    $stmt = $conn->prepare($sql); 
    $stmt->execute(); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
    {   
     echo $row['itemName']; 
    } 
?> 

我的目标是用拉datepicker的白手起家的项目,但对于这个测试的目的我使用ITEMNAME。 该php文件出现空白?

我检查了字段名称db_config,并且不确定问题来自哪里。

请让我知道,如果我在我的陈述中犯了错误或任何看起来不对的错误。

+1

在查询中用单引号将'$ itemName'换行或更好地使用预处理语句。 – potashin

+0

*“php文件不显示任何错误:”* - 这是因为你没有检查它们。在连接打开后立即添加'$ conn-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'。 –

+0

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064您的SQL语法中有错误;在C:\ WWW \ htdocs \ test \ wholesale \ php \ getproduct.php:第10行中检查与您的MySQL服务器版本相对应的手册,以便在'第1行'订购WHERE itemName ='Sour Dough'附近使用正确的语法堆栈跟踪:#0 C:\ WWW \ htdocs \ test \ wholesale \ php \ getproduct.php(10):PDOStatement-> execute()#1 {main}抛出C:\ WWW \ htdocs \ test \ wholesale \ php \ getproduct.php在线10 – Elevant

回答

4

首先,您使用的是MySQL reserved word,为order,它需要特别注意;主要使用它周围的蜱虫。

然后,由于我们正在处理一个字符串,$itemName需要用引号包装。

<?php 
    include('db_config.php'); 
    $itemName = 'Item1'; 

    $sql = "SELECT * FROM `order` WHERE itemName = '$itemName';"; 
    $stmt = $conn->prepare($sql); 
    $stmt->execute(); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
    {   
     echo $row['itemName']; 
    } 
?> 
  • 要么使用蜱在你的表名,或重命名为“订单”,它不是一个保留关键字。

"The php file does not show any errors:"

那是因为你没有检查他们。

在连接打开后立即添加$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



按照你离开包含MySQL错误您的问题下方评论:

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 'order

  • 读它near 'order它开始于 “秩序”。

现在,如果过您的查询应该永远包含任何字符MySQL会抱怨,如报价等等,那么你就需要逃避你的查询,并使用准备好的语句。

例如,如果使用:

$itemName = "Timmy's Sour Dough"; 

将转化

WHERE itemName = 'Timmy's Sour Dough' 

又抛出一个语法错误。

因此,最好马上立即转义任何数据。

编辑

您使用的preparenew to PDO共同表明您已经尝试使用准备好的语句,只是不正确的做法。从准备充分的声明中,你只是一点点。在你的代码的一种正确的方法是

$sql = "SELECT * FROM `order` WHERE itemName = ? "; 
    $stmt = $conn->prepare($sql); 
    $stmt->execute(array($itemName)); 

注意我们是如何在你的查询?那么我们在您的execute呼叫发送它的值。你去:)

+0

生病使这些改变类型是有道理的,虽然用保留字 – Elevant

+0

@Elevant无限;-) –

+0

伟大的它终于得到解决,我没有意识到有关保留字的事情,谢谢你队友我会看预备队的作品等等。我真的不明白你周围的蜱的含义。 – Elevant

1

你完全无视人们使用PDO的主要原因。预处理语句是你应该用什么,这将使您的查询是这样的:

$itemName = 'Item1'; 

$sql = "SELECT * FROM order WHERE itemName = ?"; 
$stmt = $conn->prepare($sql); 
$stmt->bindParam(1, $item, PDO::PARAM_STR); 
$stmt->execute(); 

阅读上bindParam()


今后,打开在脚本的开始报告与此您的错误:

ini_set('display_errors', 1); 
error_reporting(E_ALL); 

,将节省您大量的时间。

+0

即使使用这种方法,它似乎并没有显示。如果该字段有两个单词,它会有什么区别吗? – Elevant

+0

我尝试添加一个尝试并捕获,但没有任何显示。我不确定我是否正确地添加了该语句,尽管 – Elevant

+0

使用您提供的显示错误代码仍然没有显示任何内容?我是否用错误的方式写了这个声明? – Elevant

0

看起来你sql语句中有错误。因为ITEMNAME或者是在你的数据库中的VARCHAR或文本,你需要把它放在单引号中查询:

$sql = "SELECT * FROM order WHERE itemName = '$itemName';"; 
+0

我尝试添加单引号,但仍然没有显示出来。该字段是一个VarChar。 – Elevant