2014-06-23 30 views
0

當預期有許多結果時,我從MySQL數據庫獲得1個結果。PHP MYSQLI返回一行而不是很多

看看下面,你將看到的mysqli對象有NUM_ROWS = 42,但我只得到1分的結果,當我的print_r的fetch_array(MYSQLI_ASSOC)

調試響應:

SELECT * from edi_packets_to_send WHERE `send` = 't' AND `network_id` = '8012' 

    mysqli_result Object 
    (
     [current_field] => 0 
     [field_count] => 13 
     [lengths] => 
     [num_rows] => 42 
     [type] => 0 
    ) 
    Array 
    (
     [id] => 413 
     [packet] => 02 07 00 01 ff 14 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
     [priority] => 4 
     [send] => t 
     [seq] => 
     [network_id] => 8012 
     [times] => 2014-06-23 22:52:28 
     [termostat_location] => 0007 
     [packet_type] => 14 
     [no_of_attemps] => 4 
     [network_network_id] => 61 
     [cms_room_id] => 157 
     [action_code] => 4 
    ) 

我的代碼:

<pre> 
<?php 

define('DB1_HOSTNAME','localhost'); 
define('DB1_USERNAME','xxxxxxx'); 
define('DB1_PASSWORD','xxxxxxx'); 
define('DB1_DATABASE','xxxxxxx'); 
define('DB1_PORT','3306'); 

/* DB connection */ 
$db = mysqli_connect(DB1_HOSTNAME, DB1_USERNAME, DB1_PASSWORD, DB1_DATABASE); 
if (mysqli_connect_errno($db)) {throw new exception("Failed to connect to MySQL: " . mysqli_connect_error());} 


$sql = "SELECT * from edi_packets_to_send WHERE `send` = 't' AND `network_id` = '8012' "; 
echo "<br>".($sql)."<br><br>"; 

if(!$results = $db->query($sql)){throw new Exception("SQL Failed ".__file__." on line ".__line__.":\n".$sql."\n".mysqli_error($db));} 
print_r($results); 

if ($results->num_rows > 0){ 

    $array = $results->fetch_array(MYSQLI_ASSOC); 
    print_r($array); 
} 

數據庫TA竹葉提取:

DROP TABLE IF EXISTS `edi_packets_to_send`; 
    CREATE TABLE `edi_packets_to_send` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `packet` varchar(249) DEFAULT NULL, 
    `priority` int(11) DEFAULT NULL, 
    `send` varchar(15) DEFAULT NULL, 
    `seq` varchar(6) DEFAULT NULL, 
    `network_id` int(11) DEFAULT NULL, 
    `times` datetime DEFAULT NULL, 
    `termostat_location` varchar(12) DEFAULT NULL, 
    `packet_type` varchar(6) DEFAULT NULL, 
    `no_of_attemps` int(11) DEFAULT NULL, 
    `network_network_id` int(11) DEFAULT NULL, 
    `cms_room_id` int(11) DEFAULT NULL, 
    `action_code` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`), 
    KEY `priority` (`priority`), 
    KEY `cms_room_id` (`cms_room_id`), 
    KEY `network_id` (`network_id`), 
    KEY `network_network_id` (`network_network_id`), 
    KEY `send` (`send`), 
    KEY `action_code` (`action_code`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=413 DEFAULT CHARSET=utf8; 



    INSERT INTO `edi_packets_to_send` VALUES ('413', '02 07 00 01 ff 14 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '4', 't', null, '8012', '2014-06-23 22:52:28', '0007', '14', '4', '61', '157', '4'); 
    INSERT INTO `edi_packets_to_send` VALUES ('414', '02 07 00 01 ff 1e ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '5', 't', null, '8012', '2014-06-23 22:10:25', '0007', '1e', '1', '61', '157', '5'); 
    INSERT INTO `edi_packets_to_send` VALUES ('415', '02 07 00 01 ff 1f ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '111', 't', null, '8012', '2014-06-23 22:05:30', '0007', '1f', '1', '61', '157', '111'); 
    INSERT INTO `edi_packets_to_send` VALUES ('416', '02 07 00 01 ff 32 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '18', 't', null, '8012', '2014-06-23 22:09:19', '0007', '32', '1', '61', '157', '18'); 
    INSERT INTO `edi_packets_to_send` VALUES ('417', '02 07 00 01 ff 0a ff ff 00 ff ff ff ff ff 05 14 05 1e 3c 1e 00 01 00 3e 0a 37 ff ff', '20', 't', null, '8012', '2014-06-23 22:07:57', '0007', '0a', '1', '61', '157', '20'); 
    INSERT INTO `edi_packets_to_send` VALUES ('418', '02 07 00 01 ff 0b 0a 52 4c 40 4d 01 01 ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '21', 't', null, '8012', '2014-06-23 22:07:24', '0007', '0b', '1', '61', '157', '21'); 
    INSERT INTO `edi_packets_to_send` VALUES ('419', '02 07 00 01 ff 32 ff 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '90', 't', null, '8012', '2014-06-23 22:06:11', '0007', '32', '1', '61', '157', '90'); 
    INSERT INTO `edi_packets_to_send` VALUES ('420', '02 08 00 01 ff 14 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '4', 't', null, '8012', '2014-06-23 22:11:14', '0008', '14', '1', '61', '158', '4'); 
    INSERT INTO `edi_packets_to_send` VALUES ('421', '02 08 00 01 ff 1e ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '5', 't', null, '8012', '2014-06-23 22:10:08', '0008', '1e', '1', '61', '158', '5'); 
    INSERT INTO `edi_packets_to_send` VALUES ('422', '02 08 00 01 ff 1f ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '111', 't', null, '8012', '2014-06-23 22:05:13', '0008', '1f', '1', '61', '158', '111'); 
    INSERT INTO `edi_packets_to_send` VALUES ('423', '02 08 00 01 ff 32 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff', '18', 't', null, '8012', '2014-06-23 22:09:03', '0008', '32', '1', '61', '158', '18'); 

任何想法,爲什麼這個特定的查詢是不是我正常工作?

PS:我運行它在本地主機上的Windows IIS 7.5 PHP版本28年3月5日(DEV)

+2

你只是執行fetch_array()一次,所以它只會取一排....執行fetch_array()在循環中獲取所有ROWA –

+3

['fetch_all '](http://www.php.net//manual/en/mysqli-result.fetch-all.php)提取所有行。 – showdev

回答

1

你需要做一個循環,fetch_array旨在搶一行,返回你請求的任何格式,並增加了行索引,以便下一次調用將獲得下一行。

試試這個:

if ($results->num_rows > 0){ 
    for($rowid=0; $rowid < $results->num_rows; $rowid++) { 
     $array=$results->fetch_array(MYSQLI_ASSOC); 
     print_r($array); //print the current row array 
    } 
} 
+0

是的,它會返回一個「整個數組」,但只代表查詢的一行。如果您想要將所有行選擇到單個數組中,請改爲使用fetch_all,如@showdev所述。編輯:評論這是一個迴應被刪除。 –

+0

工作就像一個魅力。謝謝! – Drace

0

必須使用,而()來加載所有的結果。如果你使用if,你會得到第一個結果。

if ($results->num_rows > 0){ 
$array = array(); 
while($r = $results->fetch_array(MYSQLI_ASSOC)) 
    $array[] = $r; 
} 
print_r($array); // an array with all the results.