Php 使用mysqli将行从一个数据库移动到另一个数据库

Php 使用mysqli将行从一个数据库移动到另一个数据库,php,mysql,Php,Mysql,我的问题很直截了当,我认为人们需要经常这样做;然而,经过数小时的在线搜索,没有什么特别有启发性的发现。我知道这里有一条关于使用PDO做同样事情的帖子,但我想坚持使用mysqli,以便在整个站点上保持一致 因此,我需要将一个或多个行从一个数据库移动到另一个数据库(而不是在单个数据库中从一个表移动到另一个表) 到目前为止,我的代码肯定会引起一些笑声,因为这项任务被证明远远超出了我的能力。不管怎样,下面是: 首先,我有两个mysqli\u connect。。。不确定这是否受到鼓励,尽管到目前为止还没有

我的问题很直截了当,我认为人们需要经常这样做;然而,经过数小时的在线搜索,没有什么特别有启发性的发现。我知道这里有一条关于使用PDO做同样事情的帖子,但我想坚持使用mysqli,以便在整个站点上保持一致

因此,我需要将一个或多个行从一个数据库移动到另一个数据库(而不是在单个数据库中从一个表移动到另一个表)

到目前为止,我的代码肯定会引起一些笑声,因为这项任务被证明远远超出了我的能力。不管怎样,下面是:

首先,我有两个
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连接。没有什么可以阻止它,也没有理由阻止它。这比你想象的要普遍得多(因为不同的原因)。但是,考虑到实际连接到数据库所带来的开销,我建议您不要在每次迭代中建立连接(这是最佳实践,从性能角度看)

我要做的是:

  • 首先,连接到源数据库,获取所需的数据
  • 这里没什么好说的,你已经做了,看起来还不错。检查,就像你做的那样,在继续之前至少有一个结果。如果结果集为空,则不再继续(退出)

  • 如果结果集中至少有一行,请建立到目标数据库的连接
  • 在开始循环之前执行此操作,以避免建立多个连接的性能损失。如果您查看的是成百上千行或更多行,您会真正注意到差异。一旦建立了连接,请继续

  • 循环遍历源数据并准备insert语句
  • 你可以在这里选择。a)循环整个结果集并准备一个包含多行的插入,您将在循环结束时一次插入所有行;b)在每次迭代中创建一个插入(单行),运行插入,然后继续下一次迭代

    这两种策略都有赞成和反对的理由。选择一个更适合你的


    在算法方面,您的代码已经准备就绪(只需在开始循环之前连接到目标数据库一次)。使用带绑定的参数化查询,而不是编写完整的插入字符串,可能会使您受益匪浅,但除此之外,您几乎可以做到这一点。

    如果您正在运行自己的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())停止了
    。如果您有任何建议,我将不胜感激。我想不出它会停在这里的原因。您已经完全重写了问题中的代码。请不要这样做。如果您想显示您试图使用我的答案,请将其作为补充添加,但保留原始内容。感谢您提供的信息,我不知道这一点!