|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
37818
|
|