我有一段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
查询仅在hello
表中插入十二行。对于未插入表mysqli_error() expects parameter 1 to be mysqli, boolean given in...
的查询,我收到此错误。请你看看,让我知道这个问题吗?
注意:Select
查询没有错误,代码完全回应$field1
循环中的$field2
,$field3
和while
。但是,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
的结果
答案 0 :(得分:3)
您应该只使用一个查询执行此操作:
INSERT INTO SFBAY.hello
(firstname, lastname, dob)
SELECT field1, field2, field3
FROM NYC.names
WHERE date > '2014-04-04 00:00:00'
无需首先从一个数据库和表中查询结果集,然后单独循环遍历结果集,使插入到另一个数据库和表中。
只要您使用的用户在两个数据库上都拥有属性权限(在您的示例中就是这种情况),您就可以在一个查询中跨多个数据库工作。
答案 1 :(得分:1)
感谢所有人的意见和答案。问题比我想象的要简单得多!这是因为field1
和field3
列中有一些HTML数据,因此我只是将field1
,field2
和field3
传递到while循环中mysqli_real_escape_string()
功能如下:
$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']);