【问题标题】:Nested stmt mysqli PHP嵌套 stmt mysqli PHP
【发布时间】:2015-08-17 20:45:13
【问题描述】:

我正在尝试创建第三个表,从两个不同的表中获取两个索引,以便使用以下代码在它们之间创建关联:

$query1 = "select iduniverse from universe";
$query2 = "select idfiles from files";
$query3 = "select iduniFiles from uniFiles where filesId = ? and universeId = ?";
$query4 = "insert into uniFiles (filesId, universeId) values (?,?)";

if($stmt1 = $conn->prepare($query1)){
if($stmt2 = $conn->prepare($query2)){
    if($stmt3 = $conn->prepare($query3)){
        if($stmt4 = $conn->prepare($query4)){
            $stmt1->execute();
            $stmt1->bind_result($iduniverse);
            while($stmt1->fetch()){
                $stmt2->execute();
                $stmt2->bind_result($idfiles);
                while($stmt2->fetch()){
                    $stmt3->bind_param("ii", $idfiles, $iduniverse);
                    $stmt3->execute();
                    $stmt3->store_result();
                    if($stmt3->num_rows == 0){
                        $stmt4->bind_param("ii", $idfiles, $iduniverse);
                        $stmt4->execute();
                    }
                }
            }
        }
        $stmt4->free_result();
    }
    $stmt3->free_result();
 }
 $stmt2->free_result();
}
$stmt1->free_result();

但是,如果我在第二个 while 循环后回显“here\n”:

while($stmt2->fetch()){
  echo "here\n";
  ...

当我启动我的代码时,我在屏幕输出上看不到任何内容,而且表 uniFiles 仍然为空。

我已经通过 SQL 浏览器检查了查询,并且没有任何问题。所以我不明白错误在哪里。

我的脚本有什么问题?

【问题讨论】:

    标签: php mysqli while-loop


    【解决方案1】:

    您可以使用INSERT INTO INTO SELECT ... 创建连接表

    insert into uniFiles (filesId, universeId)
    select iu.iduniverse, if.idfiles 
    from universe iu
    join files if on if.idfiles = iu.idfiles
    

    如果可能有重复,则结合INSERT IGNORE

    insert ignore into uniFiles (filesId, universeId)
    select iu.iduniverse, if.idfiles 
    from universe iu
    join files if on if.idfiles = iu.idfiles
    

    【讨论】:

      【解决方案2】:

      一个 mysqli 连接一次只能保存一个活动的准备好的语句。

      因此,您不能在同一连接上激活嵌套的预准备语句。如果您需要使它们全部处于活动状态(至少对于您不希望被下一级查询挤压的每个嵌套),您必须为每个嵌套级别建立一个单独的连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-06
        • 2016-12-05
        • 2014-06-26
        • 2017-08-28
        • 1970-01-01
        • 2023-03-24
        • 2018-01-12
        • 1970-01-01
        相关资源
        最近更新 更多