Php 使用mysqli将行从一个数据库移动到另一个数据库
我的问题很直截了当,我认为人们需要经常这样做;然而,经过数小时的在线搜索,没有什么特别有启发性的发现。我知道这里有一条关于使用PDO做同样事情的帖子,但我想坚持使用mysqli,以便在整个站点上保持一致 因此,我需要将一个或多个行从一个数据库移动到另一个数据库(而不是在单个数据库中从一个表移动到另一个表) 到目前为止,我的代码肯定会引起一些笑声,因为这项任务被证明远远超出了我的能力。不管怎样,下面是: 首先,我有两个Php 使用mysqli将行从一个数据库移动到另一个数据库,php,mysql,Php,Mysql,我的问题很直截了当,我认为人们需要经常这样做;然而,经过数小时的在线搜索,没有什么特别有启发性的发现。我知道这里有一条关于使用PDO做同样事情的帖子,但我想坚持使用mysqli,以便在整个站点上保持一致 因此,我需要将一个或多个行从一个数据库移动到另一个数据库(而不是在单个数据库中从一个表移动到另一个表) 到目前为止,我的代码肯定会引起一些笑声,因为这项任务被证明远远超出了我的能力。不管怎样,下面是: 首先,我有两个mysqli\u connect。。。不确定这是否受到鼓励,尽管到目前为止还没有
mysqli\u connect
。。。不确定这是否受到鼓励,尽管到目前为止还没有给我带来问题
$connect_MAIN = mysqli_connect($servername_MAIN, $username_MAIN, $password_MAIN, $dbname_MAIN);
$connect_TEMP = mysqli_connect($servername_TEMP, $username_TEMP, $password_TEMP, $dbname_TEMP);
以下是三明治中的肉的代码:
///Prepare this in advance because the 'IN' values are taken from a $_GET
$sql_select = "SELECT * FROM Concert WHERE id IN (1, 2, 3, 4)";
///Connect to source DB
$result = $connect_TEMP->query($sql_select);
if ($result->num_rows != 0) {
///Connect to destination DB
$stmt = $connect_MAIN->prepare('INSERT INTO Concert (venue_id, date, ensemble_id, info, title, repertoire, time) VALUES (?, ?, ?, ?, ?, ?, ?)');
$venue_id = $date = $ensemble_id = $info = $title = $repertoire = $time = null;
$stmt->bind_param("isissss", $venue_id, $date, $ensemble_id, $info, $title, $repertoire, $time);
while($row = $result->fetch_assoc()) {
$venue_id = $row["venue_id"];
$date = $row["date"];
$ensemble_id = $row["ensemble_id"];
$info = $row["info"];
$title = $row["title"];
$repertoire = $row["repertoire"];
$time = $row["time"];
if ($stmt->execute() === TRUE) {
if ($show_once == 1) {
echo "Info successfully submitted.";
$show_once = 0;
}
} else {
echo "Hmm, something went wrong..." . $connect_MAIN->error;
}
}
}
$stmt->close();
mysqli_close($connect_TEMP);
}
所以,我知道这有点混乱。。。正如我所说的,我不确定是否可以在<<代码>的中间连接DB2,而循环从DB1返回值。可以随意嘲笑,但前提是你有有用的建议 使用参数化查询而不是串接字符串
///Prepare this in advance because the 'IN' values are taken from a $_GET
$sql_select = "SELECT * FROM Concert WHERE id IN (1, 2, 3, 4)";
///Connect to source DB
$result = $connect_TEMP->query($sql_select);
if ($result->num_rows != 0) {
///Connect to destination DB
$stmt = $connect_MAIN->prepare('INSERT INTO Concert (venue, date, info, time) VALUES (?, ?, ?, ?)');
$venue = $date = $info = $time = null;
$stmt->bind_param("ssss", $venue, $date, $info, $time);
while($row = $result->fetch_assoc()) {
$venue = $row["venue"];
$date = $row["date"];
$info = $row["info"];
$time = $row["time"];
if ($stmt->execute()) {
///This is just to stop message from appearing multiple times.
if ($show_once == 1) {
echo "Info successfully submitted.";
$show_once = 0;
}
} else {
echo "Hmm, something went wrong..." . $stmt->error;
}
}
$stmt->close();
mysqli_close($connect_TEMP);
}
是的,您可以在脚本中的任何位置建立第二个DB连接。没有什么可以阻止它,也没有理由阻止它。这比你想象的要普遍得多(因为不同的原因)。但是,考虑到实际连接到数据库所带来的开销,我建议您不要在每次迭代中建立连接(这是最佳实践,从性能角度看) 我要做的是:
在算法方面,您的代码已经准备就绪(只需在开始循环之前连接到目标数据库一次)。使用带绑定的参数化查询,而不是编写完整的插入字符串,可能会使您受益匪浅,但除此之外,您几乎可以做到这一点。如果您正在运行自己的MySql服务器,则可以使用该引擎以更简单的方式执行此操作 联邦表的行为类似于普通表,但它将数据存储在远程数据库中。使用此引擎,您可以执行以下操作:
INSERT INTO remoteTable (values) SELECT * FROM localTable
插入时没有引用变量。由于您使用的是mysqli,请利用和。这将解决任何和所有引用问题。也不清楚为什么稍后在查询中有一个转义引用。@Barmar您指的是:“)”@不,这个:
$row[“info”]。\,'代码>然后有两个while($row=$result->fetch_assoc()){
应该是一个主要的复杂问题。像这样的好建议应该出现在谷歌搜索中!关于您的代码的快速问题——在绑定SQL数据库中,一些变量不是字符串,而是int,这是一个问题吗?指定它很重要吗?或者SQL会毫无怨言地将字符串作为int吗?您可以这样回答吗可以将bind_param()
调用中的那些列的s
更改为i
。但是MySQL也会自动转换,所以这通常并不重要。我感谢您的帮助,但我仍然坚持这一点……我已经做了这些更改,但过程神秘地在while($row=$result->fetch_assoc())停止了
。如果您有任何建议,我将不胜感激。我想不出它会停在这里的原因。您已经完全重写了问题中的代码。请不要这样做。如果您想显示您试图使用我的答案,请将其作为补充添加,但保留原始内容。感谢您提供的信息,我不知道这一点!