2016-01-28 19 views
3

我忙於嘗試執行一組涉及使用臨時表的語句。如何在語句執行期間在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 

如果這是一個錯誤與臨時表不存在,我如何保存這個表足夠長的時間來運行其餘的語句?

我曾嘗試使用:

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

與所有查詢於一身,但我需要將數據插入到一個查詢和SELECT查詢中獲取數據。

任何幫助將不勝感激,謝謝!

回答

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語句。

+0

燦爛,通過這個我注意到它去。非常感謝您的回覆。非常感謝。 – EpicJoker

4

你有一個簡單的語法錯誤使用括號中的參數是這樣

INSERT INTO tags VALUES (?) 
+0

謝謝里格斯。 – EpicJoker