2015-04-28 182 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