如何在语句执行期间保持 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)
查看是否有错误。
编辑:我刚刚注意到您的查询$query2
是INSERT 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 表可用?的主要内容,如果未能解决你的问题,请参考以下文章