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 和回答。问题比我想象的要简单得多!这是因为field1
和field3
列中有一些html数据,所以我只是通过mysqli_real_escape_string()
函数在while循环中传递了field1
、field2
和field3
,如下所示:
$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..的处理方式