PHP Mysqli подготовлен не создавая объект оператора - PullRequest
0 голосов
/ 21 июля 2009

Я использую расширение php mysqli с подготовленными инструкциями, но для одного запроса оно не создает объект запроса.

Вот код:

$sqlq = "SELECT id,name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid=?";
if($allsubcats)
{
    foreach($allsubcats as $key => $data)
    {
        $sqlq .= " OR categoryid=?";
    }
}
echo $sqlq;
if($query = $this->mysqli->connection->prepare($sqlq))
{
    $query->bind_param("i", $cat);
    if($allsubcats)
    {
        foreach($allsubcats as $key => $data)
        {
            $query->bind_param("i", $data[0]);
        }
    }
    $query->execute();
    $query->bind_result($id,$name);
    $query->store_result();
    if($query->num_rows > 0)
    {
        while($row = $query->fetch())
        {
            $allprods["id"] = $id;
            $allprods["name"] = $name;
        }
    }
    $query->close();
}

Проблема:

Линия if($query = $this->mysqli->connection->prepare($sqlq))
if() возвращает false и поэтому не создает объект $query и не выполняет никакого кода внутри if.

Возвращает echo $sqlq;:

"ВЫБЕРИТЕ ИД, имя ИЗ товарных категорий. ПРИСОЕДИНЯЙТЕСЬ к товарам НА productcategories.productid = products.id, ГДЕ categoryid =? ИЛИ categoryid =? ИЛИ ИД категории =? ИЛИ ИД категории?

Что я не вижу в этом ничего плохого.

Любая помощь будет принята с благодарностью,

Спасибо, Нико

Ответы [ 3 ]

2 голосов
/ 21 июля 2009

Как правило, я решил это сам, как только опубликовал это, кто-нибудь еще видит вещи лучше, как только они попросят о помощи ??

В любом случае,

SELECT id, name FROM productcategories ПРИСОЕДИНЯЙТЕСЬ к продуктам НА productcategories.productid = products.id ГДЕ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =?

Должно было быть

ВЫБРАТЬ productcategories.id, products.name, products.id ИЗ productcategories ПРИСОЕДИНИТЬСЯ к ПРОДУКТУ НА productcategories.productid = products.id ГДЕ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =? ИЛИ categoryid =?

1 голос
/ 21 июля 2009

Привет, Нико. Это не ответ на ваш вопрос, так как вы уже ответили на него. Просто нежелательное предложение. Я не уверен, как часто будет выполняться этот запрос или сколько категорий может быть добавлено к нему, но вы можете рассмотреть возможность использования синтаксиса WHERE IN.

Вместо:

WHERE foo = ? OR foo = ? OR foo = ? OR foo = ?

Использование:

WHERE foo IN (?,?,?,?)

Вы сделаете запросы более читабельными и сэкономите минимальное количество времени в своем приложении. (отправка меньшего количества данных в MySQL, меньшие строки в PHP)

0 голосов
/ 21 июля 2009

Не думаю, что вы на самом деле вызываете prepare для объекта соединения, а просто для самого объекта mysqli.

т.е.


if($query = $this->mysqli->connection->prepare($sqlq))

должно быть просто


if($query = $this->mysqli->prepare($sqlq))

Редактировать
Оформить заказ в первом примере:
http://php.net/manual/en/mysqli.prepare.php

Edit2:

Ах, да, я вижу.

В качестве примечания вы должны рассмотреть возможность наложения псевдонимов на свои таблицы:


SELECT pc.id,p.name,p.id
FROM productcategories pc
JOIN products p ON pc.productid = p.id
WHERE categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...