PHP MYSQLI返回一行而不是多行

时间:2014-06-23 23:30:54

标签: php mysql select mysqli

当预计会有很多结果时,我会从MySQL数据库中获得1个结果。

看下面,你会看到MySQLI对象有NUM_ROWS = 42,但是当我print_r fetch_array(MYSQLI_ASSOC)

时我只得到1个结果

调试回复:

    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);
}

数据库表:

    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:我在localhost Windows IIS 7.5 PHP版本5.3.28(dev)上运行它

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

您必须使用while()加载所有结果。如果您使用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.