Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1 2
PDO это еще и абстракция от типа БД
Неактивен
В MySQLi к примеру есть multiquery.
В ХП делаешь 10 SELECT'ов - потом из результата последовательно забираешь
А почему нельзя к той же ХП обратиться через mysql_query, а потом mysql_fetch_row/assoc()?
PDO просто удобнее, кодить в разы меньше.
А что такое PDO?
Неактивен
multiquery это именно и есть много запросов
не один который выдает много строк, а несколько разных. И выдавать каждый из них может что угодно. Один набор строк, второй одно значение и т.д.
это возможность в одной процедуре собрать их в кучу.
PDO
http://www.php.net/manual/ru/book.pdo.php
Неактивен
Ух, помогли нереально просто. Спасибо.
Еще бы ответ на совсем ламерские пару вопросов.
Все же можно или нет сделать подготовку запросов через mysql_query
И как получить то что вернула процедура в случае
$res=mysql_query('CALL test_proc()')
Сама процедура это просто SELECT 1
Когда делаю через менеджер базы то получаю 1. Когда делаю через mysqli то получаю 1, но когда через mysql_query() и дальше какой нибудь mysql_fetch_... , то данные не могу получить. (PROCEDURE 2.test_proc can't return a result set in the given context)
___________________________
Решение было найдено, может и кривое, но все же
в ХП сделал так
BEGIN
SET @a=(SELECT 1);
END
А в скрипте
mysql_query('CALL test_proc()');
$res=mysql_query('SELECT @a');
дальше с результатом работаю как обычно.
Если можно иначе, подскажите.
З.Ы.
Как же все таки я был слеп... когда перешел на mysqli думая что mysql не может делать то что мне нужно.
Знание - сила! Спасибо вам!
Отредактированно MaxRed (31.10.2008 02:45:11)
Неактивен
Про mysql проскакивало, что не умеет корректно работать с ХП. Похоже на это ты и попал.
Если с MySQLi работет нормально - так и продолжай с ней работать.
Только поиском посмотри в этой конфе Out of Sync - обсуждалось. Есть такие грабли в mysqli, в принципе если знать проблем никаких. Если не знать - можно долго проковыряться.
Неактивен
Да, действительно обычные mysql-функции в PHP не умеют извлекать данные из хранимых процедур. См. например слайд № 32 в презентации http://www.slideshare.net/dpc/dpc2007-m … and-bouman
В то же время, создавать процедуры или использовать процедуры, не возвращающие значения (например, вставлять данные) с помощью обычной mysql_query() можно.
Неактивен
Скажите пожалуйста, могу я получить данные следующим способом?
DELIMITER $$ DROP PROCEDURE IF EXISTS `p4` $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `p4`(OUT intID, OUT varcharStatus, OUT varcharName) BEGIN DECLARE intID INT; DECLARE varcharStatus, varcharName VARCHAR; SELECT * INTO intID, varcharStatus, varcharName FROM `tCandidates`; RETURN intID, varcharStatus, varcharName; END DELIMITER ;
mysql_query('CALL p4()'); $res=mysql_query('SELECT @a');
http://sqlinfo.ru/forum/viewtopic.php?pid=10939#p10939
http://phpclub.ru/talk/showthread.php?s … did=116501
Отредактированно vlad275 (08.10.2009 12:46:56)
Неактивен
Не вижу никаких проблем в этом, только CALL p4(@a,@b,@c);
Или внутри процедуры
SELECT @a = ...
Неактивен
Не могу сохранить sp, так как MySQL Query Browser нашел ошибку. Но я не могу понять в чем ошибка.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' OUT varcharStatus, OUT varcharName)
BEGIN
DECLARE intID INT;
DECLARE var' at line 1
Неактивен
У каждой переменной должен быть тип данных.
Неактивен
Не могу найти ошибку. Так тоже не работает:
DELIMITER $$
DROP PROCEDURE IF EXISTS `variantdialog_99k_db1`.`p4` $$
CREATE PROCEDURE `variantdialog_99k_db1`.`p4` (OUT intID INT, OUT varcharStatus VARCHAR)
BEGIN
#DECLARE intID INT;
# DECLARE varcharStatus, varcharName VARCHAR;
SELECT intID, varcharStatus INTO intID,v archarStatus FROM t;
END $$
DELIMITER ;
Ошибка:
Script line: 4 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')
BEGIN
#DECLARE intID INT;
# DECLARE varcharStatus, varcharName VARCHAR;
' at line 1
Отредактированно vlad275 (08.10.2009 14:22:06)
Неактивен
VARCHAR - это не тип данных. Тип данных - VARCHAR(20), например.
Неактивен
Видимо надо закрывать коннект с базой... После выполнения скрипта... Он же ругается на большое количество подключений.
Неактивен
Собственно искал ответ на вопрос как извлечь данные после вызова хранимой процедуры, и должен сказать что автор сбил меня с толку дней так на два ...
С этим кодом почти все нормально ...
$DB_HOST = 'localhost';
$DB_LOGIN ='root';
$DB_PASS = '555';
$DB_NAME = '2';
$mysqli = new mysqli($DB_HOST,$DB_LOGIN,$DB_PASS,$DB_NAME,3307);
for ($i=1; $i<100; $i++)
{
if($stmt = $mysqli->prepare("CALL test_proc()"))
{
//$stmt->bind_param('s',$h);
$stmt->execute();
$stmt->bind_result($add);
$stmt->fetch();
$stmt->close();
echo $add;
}
else
{
printf("Errormessage: %s\n", $mysqli->error);
exit;
}
}
$mysqli->close();
А не работает он потому что автор темы пытался подготовить несколько раз вызов одного и тогоже запроса, вот собственно откуда ошибка.
Вот как нужно было на самом деле ... Мне аж преснилась эта тема Всем кто штопорнулся на этом месте желаю всех благ и удачи!
if($stmt = $mysqli->prepare("CALL page_select()")){
for ($i=1; $i<10; $i++)
{
//$stmt->bind_param('s',$h);
$stmt->execute();
$stmt->bind_result($add);
$stmt->fetch();
echo $add . '<br />';
}
}else
{
printf("Errormessage: %s\n", $mysqli->error);
exit;
}
$stmt->close();
Неактивен
MaxRed При выполнении хранимой процедуры мускул возвращает количество резалт сетов в процедуре +1. Поэтому если в процедуре даже SELECT 1. Результат будет 2 резалт сета. Вам нужно в цикле перебрать все резалты (nextresult) после выполнения процедуры.
Неактивен
Страниц: 1 2