Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
mysqli_prepare+вызов ХП с prepare (артем) 07/01/2011 - 07:49:42



From: артем - 07/01/2011 - 07:49:42
Subject:mysqli_prepare+вызов ХП с prepare
-----------------
привет всем. проблема с mysqli_prepare, криво работает когда вызывает хранимку внутри которой уже есть prepare.

PHP code:
<?
$db = mysqli_connect("localhost","user","password","real");
$stmt = mysqli_prepare($db, "call testproc_safe2_prep(?,?)");
mysqli_stmt_bind_param($stmt,'ss', $_GET['param1'],$_GET['param2']);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $name);

while (mysqli_stmt_fetch($stmt)) {
echo $name;
echo " ";
}
mysqli_stmt_close($stmt);
?>

Процедура:

PROCEDURE `real`.testproc_safe2_prep(IN param1 VARCHAR(255), IN param2 VARCHAR(255))
BEGIN

SET @query = 'SELECT field1 FROM test_table WHERE 1=1';

IF param1 IS NOT NULL Then
SET @query = CONCAT(@query, ' AND criteria1 = ', param1);
END IF;

IF param2 IS NOT NULL Then
SET @query = CONCAT(@query, ' AND criteria2 = ', param2);
END IF;

PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

При открытии php скрипта получаем белиберду:
http://i013.radikal.ru/1101/c3/362690f7380d.jpg

Есть другая процедура, делает то же самое что и первая:

PROCEDURE `real`.testproc_safe2_case(IN param1 VARCHAR(255), IN param2 VARCHAR(255))
BEGIN

SELECT field1 FROM test_table
WHERE 1 = 1
AND CASE WHEN param1 IS NULL THEN 1
ELSE CASE WHEN criteria1 = param1 THEN 1
ELSE 0 END END = 1
AND CASE WHEN param2 IS NULL THEN 1
ELSE CASE WHEN criteria2 = param2 THEN 1
ELSE 0 END END = 1;


END

Если вызываем вторую ХП вместо первой:
$stmt = mysqli_prepare($db, "call testproc_safe2_case(?,?)");

Все ок:
http://s52.radikal.ru/i138/1101/26/2e29daf0daa4.jpg

Процедуры возвращают те же самые наборы данных, первая через concat+prepare, вторая через case. Но с первой косяк с mysqli_prepare

Пример запуска из консоли:

mysql> call testproc_safe2_prep(1,1);
+-----------+
| field1 |
+-----------+
| Kuznetsov |
+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call testproc_safe2_case(1,1);
+-----------+
| field1 |
+-----------+
| Kuznetsov |
+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test_table;
+----+-----------+-----------+-----------+
| id | field1 | criteria1 | criteria2 |
+----+-----------+-----------+-----------+
| 1 | Ivanov | 0 | 0 |
| 2 | Petrov | 0 | 1 |
| 3 | Sidorov | 1 | 0 |
| 4 | Kuznetsov | 1 | 1 |
+----+-----------+-----------+-----------+
4 rows in set (0.00 sec)

mysql> select version();
+---------------------+
| version() |
+---------------------+
| 5.0.45-community-nt |
+---------------------+
1 row in set (0.00 sec)

В чем проблема? Подскажите плиз.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
37818



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |