PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中

Posted

技术标签:

【中文标题】PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中【英文标题】:PHP mysqli_fetch_array() does not insert all select queries into a table in a while loop 【发布时间】:2014-04-07 17:31:28 【问题描述】:

我有一段php代码如下:

$DB_FIRST_NAME = 'NYC';
$DB_SECOND_NAME = 'SFBAY';
$DB_HOST = 'localhost';
$DB_USER = '***';
$DB_PASS = '***';

$db_connect_first = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_FIRST_NAME);   
$select_query_first = "SELECT field1, field2, field3 FROM names WHERE date > '2014-04-04 00:00:00'";
$query_result_first = $db_connect_first->query($select_query_first);

$db_connect_second = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_SECOND_NAME, true);   
while($row = $query_result_first->fetch_assoc())
    $field1 = $row['field1'];
    $field2 = $row['field2'];
    $field3 = $row['field3'];
    $insert_query_second = "INSERT INTO hello (firstname, lastname, dob) VALUES ('$field1', '$field2', '$field3')";
    $insert_en_result = $db_connect_second->query($insert_query_second);

SELECT 查询返回 20 行;但是,INSERT 查询仅将 12 行插入到hello 表中。对于未插入表mysqli_error() expects parameter 1 to be mysqli, boolean given in... 的查询,我收到此错误。请您看一下并告诉我问题所在?

注意:Select 查询没有错误,代码完美呼应了while 循环内的$field1$field2$field3。但是,Insert 查询不适用于所有行。 此外,表结构相似,但字段名称不同。

  CREATE TABLE IF NOT EXISTS names (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` text NOT NULL,
  `field2` text NOT NULL,
  `field3` text NOT NULL,
  PRIMARY KEY (`id`),
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

  CREATE TABLE IF NOT EXISTS hello ( 
     id int(11) NOT NULL AUTO_INCREMENT, 
     firstname text CHARACTER SET utf8 COLLATE utf8_unicode_ci,
     lastname text CHARACTER SET utf8 COLLATE utf8_unicode_ci, 
     dob mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci, 
     PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=400 ; 

下面是数据库中Describe hello查询的图片。

同样,下面是SHOW INDEX FROM hello 的结果

【问题讨论】:

在发布到 SO 时,请不要在代码中将凭据发布到您的数据库。不管我们是否知道您的网站地址,恶意的人无处不在。 @Ohgodwhy,谢谢你的评论,当然,我会更加小心,干杯, 你能展示你的第二个表结构和相同的样本数据吗? 此外,当您在 while 循环中使用 die() 时,脚本将关闭并且不会完成执行。该问题可能是由于您正在检索的第 4 行。 Please have a look at this try/catch method, instead 您的代码很容易受到 SQL 注入攻击。此外,如果任何字段中有撇号,您的查询就会失败。请了解如何使用参数化查询。 【参考方案1】:

你应该只用一个查询来做到这一点:

INSERT INTO SFBAY.hello
    (firstname, lastname, dob)
SELECT field1, field2, field3
FROM NYC.names
WHERE date > '2014-04-04 00:00:00'

没有必要先从一个数据库和表中查询结果集,然后单独循环遍历结果集,将插入到另一个数据库和表中。

只要您使用的用户对两个数据库都具有属性权限(在您的示例中似乎就是这种情况),您就可以在单个查询中跨多个数据库工作。

【讨论】:

感谢您的回答。事实上,我真正的问题是在多个表中的不同字段之间进行更多比较。如果您可以在 while 循环中发布您的单个查询,我将不胜感激,我可以在最终插入数据之前放置其他条件, @Apiah 你能解释一下这些条件可能是什么吗?有什么理由不能将它们合并到 WHERE 子句中吗?【参考方案2】:

感谢大家的 cmets 和回答。问题比我想象的要简单得多!这是因为field1field3列中有一些html数据,所以我只是通过mysqli_real_escape_string()函数在while循环中传递了field1field2field3,如下所示:

$field1 = mysqli_real_escape_string($db_connect_second, $row['field1']);
$field2 = mysqli_real_escape_string($db_connect_second, $row['field2']);
$field3 = mysqli_real_escape_string($db_connect_second, $row['field3']);

【讨论】:

以上是关于PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

PHP mysqli_fetch_array选择最小值[重复]

PHP mysqli_free_result()与mysqli_fetch_array()函数

PHP mysqli_fetch_array() 不会在 while 循环中将所有选择查询插入到表中

为啥 mysqli_fetch_array() 返回数组大小的两倍? [关闭]

报错提示:mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in..的处理方式

MySQL:mysqli_fetch_array() [重复]