Я занят попыткой выполнить набор операторов, предполагающих использование временной таблицы.

Моя цель - создать временную таблицу, вставить в нее значения, а затем провести аналогичное сравнение содержимого временных таблиц с другой таблицей.

Эти операторы отлично работают в phpmyadmin при выполнении из RAW SQL, но я предполагаю, что таблица недоступна, когда я пытаюсь вставить данные.

Ниже приведен код моей функции 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.

Любая помощь будет оценена по достоинству, спасибо!

3
EpicJoker 28 Янв 2016 в 13:50

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 (?);";

Также обратите внимание, что вам не нужен ; для завершения операторов SQL, переданных в mysqli::prepare.

2
SOFe 28 Янв 2016 в 11:00

У вас простая синтаксическая ошибка, используйте скобки вокруг таких параметров, как этот

INSERT INTO tags VALUES (?)
3
RiggsFolly 28 Янв 2016 в 10:58