如何在语句执行期间保持 php 中的临时 mysqli 表可用?

Posted

技术标签:

【中文标题】如何在语句执行期间保持 php 中的临时 mysqli 表可用?【英文标题】:How to keep temporary mysqli table available in php during statement execution? 【发布时间】:2016-01-28 10:50:43 【问题描述】:

我正忙于执行一组涉及使用临时表的语句。

我的目标是创建临时表,向其中插入值,然后将临时表的内容与另一个表进行类似的比较。

当从 RAW SQL 执行时,这些语句在 phpmyadmin 中运行良好,但我假设当我尝试插入数据时该表不可用。

下面是我的php函数+mysqli执行的代码:

function SearchArticles($Tags)
    global $DBConn, $StatusCode;
    $count = 0;
    $tagCount = count($Tags);
    $selectText = "";
    $result_array = array();
    $article_array = array();

    foreach($Tags as $tag)
        if($count == 0)
            $selectText .= "('%".$tag."%')";
        else 
            $selectText .= ", ('%".$tag."%')";
        
        $count++;
    

    $query = "CREATE TEMPORARY TABLE tags (tag VARCHAR(20));";    
    $stmt = $DBConn->prepare($query);
    if($stmt->execute())

        $query2 = "INSERT INTO tags VALUES ?;";
        $stmt = $DBConn->prepare($query2);
        $stmt->bind_param("s", $selectText);
        if($stmt->execute())

            $query3 = "SELECT DISTINCT art.ArticleID FROM article as art JOIN tags as t ON (art.Tags LIKE t.tag);";
            $stmt = $DBConn->prepare($query3);
            if($stmt->execute())
                $stmt->store_result();
                $stmt->bind_result($ArticleID);
                if($stmt->num_rows() > 0)
                    while($stmt->fetch())
                        array_push($article_array, array("ArticleID"=>$ArticelID));
                    
                    array_push($result_array, array("Response"=>$article_array));
                else
                    array_push($result_array, array("Response"=>$StatusCode->Empty));
                
            else
                array_push($result_array, array("Response"=>$StatusCode->SQLError));   
            
        else
            array_push($result_array, array("Response"=>$StatusCode->SQLError));      
        
    else
        array_push($result_array, array("Response"=>$StatusCode->SQLError));
    
    $stmt->close();
    return json_encode($result_array);

第一条语句完美执行,但是第二条语句给了我以下错误:

PHP Fatal error:  Call to a member function bind_param() on a non-object

如果这是与 Temp 表不存在有关的错误,我如何将该表保留足够长的时间以运行其余语句?

我试过用:

$stmt = $DBConn->multi_query(query);

将所有查询合二为一,但我需要将数据插入一个查询并从 SELECT 查询中获取数据。

任何帮助将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

你有一个简单的语法错误,像这样使用括号括起来的参数

INSERT INTO tags VALUES (?)

【讨论】:

【参考方案2】:

这不是临时表的问题。它应该保持在同一个连接中(除非它因超时而重置,这部分不确定)。

错误是$stmt 是一个非对象。这意味着您的查询无效(语法错误),因此 mysqli 拒绝创建 mysqli_stmt 的实例并返回一个布尔值。

使用var_dump($DBConn->error)查看是否有错误。

编辑:我刚刚注意到您的查询$query2INSERT INTO tags VALUES ?(无论如何; 是多余的)。如果它变成一个字符串"text",它就会变成INSERT INTO tags VALUES "text"。这是一个 SQL 语法错误。你应该用() 包裹?,所以它变成INSERT INTO tags VALUES (?)

总之,改变这一行:

$query2 = "INSERT INTO tags VALUES ?;";

到:

$query2 = "INSERT INTO tags VALUES (?);";

还请注意,您不需要 ; 来终止传递给 mysqli::prepare 的 SQL 语句。

【讨论】:

太棒了,通过这个我注意到了。非常感谢您的回复。非常感谢。

以上是关于如何在语句执行期间保持 php 中的临时 mysqli 表可用?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL实战第三十七讲- 什么时候会使用内部临时表?

在SSIS中的不同组件间使用局部临时表

如何在KVM VM中的java和php进程之间的进程间通信中摆脱tcp-ip发送延迟

如何在执行期间保持 VBScript 命令窗口打开

如何在SQL中使用JOIN执行UPDATE语句?

如何在PHP中的SELECT语句中执行子查询?