微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正忙着尝试执行一组涉及使用临时表的语句.

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

当从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查询获取数据.

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

解决方法:

这不是临时表的问题.它应该保留在整个相同的连接中(除非它在超时时重置,不确定这部分).

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

使用var_dump($DBConn->错误)查看是否有任何错误.

编辑:我刚刚注意到你的查询$query2是INSERT INTO标签VALUES? (无论如何,这是多余的).如果这成为字符串“text”,这将成为INSERT INTO标签VALUES“text”.这是sql语法错误.你应该包裹? with(),所以它变成INSERT INTO标签VALUES(?).

总之,改变这一行:

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

至:

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

还要注意你不需要;终止传入MysqLi :: prepare的sql语句.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐