2014-02-28 34 views
0

我試圖使用mysqli語句從MySQL表中檢索單個行。我已經嘗試了幾次不同的代碼迭代,基於此論壇上的各種先前的問題微妙地改變了結構,以及其他一些問題,但似乎無法獲得除'null'以外的任何結果。Mysqli查詢爲數據庫中的簡單行字符串返回空值

這是一個較大的腳本的一部分,它通過jQuery的Ajax請求調用。我已經在下面包含了PHP和Javascript,儘管我對JS的行爲很有信心(現在準備告訴別人......)。

任何關於我哪裏出錯的建議都會非常感謝,因爲我無法再看到樹木,並且只是繞着圈子走。

PHP:

//initiate new mysqli object 
$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name); //custom subclass, this definitely works as is used in other scripts on the server 

//prepares DB query. Query has been tested on phpmyadmin and returns the expected data set 
$stmt = $retrieve_link->prepare("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2"); 

$stmt->execute(); //no params to bind, so execute straight away 
$stmt->bind_result($item); 
$stmt->fetch(); 
$dataset = $item->fetch_row(); 

$response[0] = $dataset; //returned data forms part of larger dataset 
echo json_encode($response); //return the entire dataset to a jquery Ajax request 
die; 

JS:

//this definitely works as objects have been returned via the 'success' function as the code was being developed 
$.ajax({ 
url   : "items/populate-home-page-script.php", 
type  : "GET", 
data  : {data:toSend}, 
dataType : "json", 
success  : function(data){ 
    alert(data[0]); 
}, 
error  : function(jqXHR, textStatus, errorThrown){ 
    alert(textStatus+','+errorThrown); 
} 
}); 

return false; 

我還試圖使用fetch_assoc()fetch_row()作爲PHP查詢的一部分,同時沿從PHP參考材料herehere。我也從Stackoverflow thisthisthis中讀到了這些問題,但對於我嘗試的每種不同代碼組合,我仍然看到null的回報。

正如我在代碼評論中所說的,我知道到DB的鏈接工作正如我在其他腳本中使用它,並在此腳本中的其他區域 - 所以沒有理由爲什麼這個對象wouldn'不管工作。我也知道查詢返回輸入到phpmyadmin的預期數據。

返回的數據只是一些字符串,我想做的任何事情都是將大約16個返回的數據集作爲循環的一部分存儲到數組中,然後將此數組返回給Ajax請求。

+0

刪除所有 – 2014-02-28 02:12:57

+0

是否檢查有沒有查詢後由MySQL報告的錯誤反引號? –

+0

@Dagon - 嘗試刪除這些無濟於事,不幸的是, – dsaa

回答

1

您正在使用「AuctionMySQLi」,它似乎延伸了常規的Mysqli驅動程序。我會假設它正確地做到了這一點。

您正在使用準備好的語句,在這種情況下可能是一種矯枉過正的語句。你可以做到相同的事情有這樣的事情(PHP 5.3,mysqli的+ mysqlnd):

$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name); 
$result = $retrieve_link->query("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2"); 
if($result !== false) { 
    echo json_encode($result->fetch_all()); 
} else { 
    echo json_encode(array()); 
} 
$retrieve_link->close(); 

如果你使用的是舊版本的PHP,或mysqlnd不可用,也可以做

$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name); 
$result = $retrieve_link->query("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2"); 
if($result !== false) { 
    $output = array(); 
    while($row = $result->fetch_assoc()) { 
     $output[] = $row; 
    } 
    echo json_encode($output); 
} else { 
    echo json_encode(array()); 
} 
$retrieve_link->close(); 

我也明白你想限制結果的數量。在這兩種情況下,完成它的一個好方法是在SQL中使用LIMIT語句。源代碼整體開銷較低。否則,您可以使用array_slice對解決方案1中的result-> fetch_all()進行分片,或者對解決方案2中的$ output進行分片。

最後,如果您在使用準備好的聲明中堅持閱讀說明在 http://ca2.php.net/manual/en/mysqli-stmt.bind-result.php 和分析提供的示例:

$retrieve_link = new AuctionMySQLi($db_host, $db_user, $db_password, $db_name); 
$stmt = $retrieve_link->prepare("SELECT `item_number`,`item_name`,`item_category`,`end_date`,`auction_type`,`high_bid_number` FROM `item` WHERE `item_number`=2"); 
$stmt->execute(); 
$stmt->bind_result($itemName, $itemCat, $endDate, $auctionType, $highBidder); 
$output = array(); 
while($stmt->fetch()) { 
    $output[] = array($itemName, $itemCat, $endDate, $auctionType, $highBidder); 
} 
echo json_encode($output); 
$retrieve_link->close() 
+0

,因爲第三個代碼被剪切結果無需改變太多我的方法。也就是說,我承擔了對這個簡單查詢使用準備好的語句的過度殺戮。 不幸的是,結果數組仍然顯示空值,但我不知道爲什麼,但問題中提出的問題已成功解決。 – dsaa

0

它在我看來像你可能有一些關於->fetch()->fetch_row()混淆。你應該使用其中一種,但不能同時使用。

試試這個檢索結果集:

$stmt->execute(); 
while ($dataset = $stmt->fetch_row()) { 
    $response[] = $dataset; //returned data forms part of larger dataset 
} 

這將追加結果集到$迴應陣列的每一行。

相關問題