mysqli_prepare() и текст запроса

uchenik

Новичок
mysqli_prepare() и текст запроса

PHP:
$db = new mysqli(DB_HOST, DB_USER, DB_PWD, 'test');

$sql = $db->prepare('update table set field=? where id=?');
$sql->bind_param('ii', $value, $id);
Как получить текст запроса после замены меток "?" на значения переменных?
 

zerkms

TDD infected
Команда форума
uchenik
а зачем тебе собственно это нужно?

HraKK
а ты случайно не забыл что плейсхолдеры экранируются?
 

zerkms

TDD infected
Команда форума
хм... а я для отладки пользуюсь консолью mysql
 

Фанат

oncle terrible
Команда форума
мляяя.
или ответьте человеку на вопрос, или не засоряйте топик!
 

fixxxer

К.О.
Партнер клуба
Могу предложить идиотский вариант - сделать явно ошибочный запрос (скажем добавить TRIGGER_ERROR в начало запроса), выполнять запрос и смотреть сообщение об ошибке. :)
 

Gorynych

Посетитель PHP-Клуба
пользуюсь вот этим (у меня метод класса, переделал в функцию, вроде не касячит)
Код:
function sql_dump($sql,$param=null) {
    if ( preg_match_all("/(\?)/", $sql, $match) ) {
        if ( !isset($param) ) {
            $param = array("FALSE");
        } elseif ( !is_array($param) ) {
            $param = array($param);
        }
        while ( sizeof($match[1]) > sizeof($param) ) {
            array_push($param, "FALSE");
        }
        return vsprintf( str_replace("?", "'%s'", $sql), $param );
    } else {
        return $sql;
    }
}


$sql = "select * from t1 where id=? and  cat in (?,?)";
echo sql_dump($sql, array(1,'test','debug'));
P.S. если параметров не хватает - вместо них в дамп подставляются 'FALSE'
 

uchenik

Новичок
fixxxer,

Даже такой вариант не проходит :)

На неправильный шаблон запроса выдает: "Fatal error: Call to a member function bind_param() on a non-object in " и т.д.

-~{}~ 23.06.06 22:34:

Похоже действительно придется использовать самопальную функцию.
 

Gorynych

Посетитель PHP-Клуба
э... как бы это попроще-то... эта функция - отладочный дамп запроса с подстановкой параметров. Она не решает проблемы, она возвращает запрос с подстановками.

сообщение об ошибке скорее говорит о том, что объект-сеодинение ($db) не создался. Вы к базе-то подконнектились? Уверены?
 

uchenik

Новичок
Gorynych,
Имеется ввиду такой код:
PHP:
$sql = $db->prepare('ERROR update test set field=? where id=?');
$sql->bind_param('si', $string, $id);
Ошибка выскакивает при вызове метода bind_param().
 

Gorynych

Посетитель PHP-Клуба
uchenik


проверьте что соединение установлено, меня смущает текст сообщения об ошибке:
Код:
$db = new mysqli(DB_HOST, DB_USER, DB_PWD, 'test');

if (mysqli_connect_errno()) {
   printf("Connect failed: %s\n", mysqli_connect_error());
   exit();
}
 

uchenik

Новичок
Gorynych, конечно соединение установлено.

Сообщение об ошибке говорит о том, что не создался объект $sql, который возвращает метод $db->prepare().

Причина - синтаксичеки неверный запрос "ERROR update test set field=? where id=?".

Попутно установили, что метод prepare() выполняет синтаксический анализ запроса :)
 

Gorynych

Посетитель PHP-Клуба
uchenik
ну про то, что prepare проверяет запрос это не секрет...

э... а можно структуру таблицы, а то это уже на бред становится похожим :)
 
Сверху