помогите плиз, что-то я туплю. есть клас rpsql, который есть mysqli со своим конструктором. не получается по человечески вызвать 2 процедуры подряд : Код (Text): $sql=new rpsql(); $result=$sql->query("call select_navi_names($nGrpId,$nSubGrpId,$nVendorId)"); $sqlRow = $result->fetch_array(MYSQLI_ASSOC); $result->close(); $cGrpName=$sqlRow['GRP_NAME']; $cSubGrpName=$sqlRow['SUBGRP_NAME']; $cVendorName=$sqlRow['VENDOR_NAME']; if ($_SESSION['TovarId']>0){ $nTovarId=$_SESSION['TovarId']; //$sql=new rpsql(); $result=$sql->query("call select_tovar_header($nTovarId)"); //printf("Ошибка: %s\n", $sql->error); $sqlRow = $result->fetch_array(MYSQLI_ASSOC); $cTovarName=$sqlRow['TOVAR_NAME']; почему мне $result->close(); не помогает ? (Commands out of sync; you can't run this command now ) / если раскомментировать //$sql=new rpsql(); то все работает, но некрасиво пересоединяться-то. В общем подскажите, где я ступил с использованием mysqli_result::free, судя по описанию после использования $result->close() должно все работать, чего я не догоняю подскажите плиз....
да в общем-то почти чистый mysqli, ну и для дебуга вторая функция листинг результата там-же в классе вписана, хоть в нее $result и надо передавать, но это фигня: Код (Text): <?php class rpsql extends mysqli { // // подключимся сразу куда надо // function __construct() { $rphost = "192.168.13.101"; $rpdb = "ххххххххх"; $rpuser = "хххххххххххххххх"; $rppassword = "хххххххххххххххххх"; parent::__construct($rphost,$rpuser,$rppassword,$rpdb); $this->query("set character_set_client='cp1251'"); $this->query("set character_set_results='cp1251'"); $this->query("set collation_connection='cp1251'"); $this->query("set names 'cp1251'"); } } // для отладки отдельныме функции function listtable($result) { // разберем результат $fieldcount = $result->field_count; printf( "<br>\n --------- листинг таблицы, полей ".$fieldcount); printf("\n<table border=1>\n"); printf("<tr>\n"); $fields=$result->fetch_fields(); foreach ($fields as $val) { printf('<th>'.$val->name.'</th>\n'); } printf("</tr>"); while ( $sqlRow = $result->fetch_array(MYSQLI_NUM) ) { printf( "<tr>"); foreach ($sqlRow as $fval) printf("<td>".$fval."</td>\n"); printf("</tr>\n"); } printf("</table>\n"); printf( "\n --------- конец листинга таблицы\n<br>"); } ?> итого в принципе пользую mysqli, функции в call отдают один результат, потому и вызываю через query(). по сути real_query() и store_result() для одного резльтата будет то-же ? по идее после $result->close() должно-бы освобождаться и снова query() работать ? что-то не до конца я видимо в логику mysqli въехал, раньше просто mysql было, но теперь решил переваять на mysql5 и все брать проедуры. все пошло хорошо, но пересоздавать класс перед вторым query() некрасиво вместо того чтобы освободить. Добавлено спустя 20 минут 58 секунд: создал такой тест : Код (Text): <?php require_once('./lib/rpsql.class'); $sql=new rpsql(); //$result=$sql->query("select * from vendors"); $result=$sql->query("call select_navi_names(5,1,3)"); listtable($result); $result=$sql->query("select * from groups"); listtable($result); ?> итого если выполняю последовательно 2 селекта, то даже без освобождения результатов все работает. комментирую первый селект и вместо него в query пишу call , и ситуация повторяется. итого после call результат так просто не освобождается .... Добавлено спустя 3 минуты 15 секунд: и добавление $result->close(); перед вторым запросом тоже не помогает Добавлено спустя 2 минуты 11 секунд: замена query на real_query тоже ничего не дает Код (Text): //$result=$sql->query("call select_navi_names(5,1,3)"); $sql->real_query("call select_navi_names(5,1,3)"); $result=$sql->store_result(); listtable($result); $result->close(); Добавлено спустя 29 минут 45 секунд: разобрался однако, так работает : Код (Text): <?php require_once('./lib/rpsql.class'); $sql=new rpsql(); //$result=$sql->query("select * from vendors"); //$result=$sql->query("call select_navi_names(5,1,3)"); $sql->real_query("call select_navi_names(5,1,3)"); $result=$sql->store_result(); listtable($result); $result->close(); while ($sql->more_results()) { printf("-----ишшо было ----------\n"); $sql->next_result(); } $result=$sql->query("select * from groups"); listtable($result); ?> итого php считает что есть еще результат от call() ? в DBFORGE вижу что результат возвращается один, да и процедура на сервере такая : Код (Text): SELECT groups.GRP_NAME FROM groups WHERE groups.GRP_ID = pGrpId INTO @cGrpName ; SELECT subgrp.SUBGRP_NAME FROM subgrp WHERE subgrp.SUBGRP_ID = pSubgrpId INTO @cSubGrpName; SELECT vendors.vendor_name FROM vendors WHERE vendors.vendor_id = pVendorId INTO @cVendorName; SELECT ifnull(@cGrpName, '') AS GRP_NAME , ifnull(@cSubGrpName, '') AS SUBGRP_NAME , ifnull(@cVendorName, '') AS VENDOR_NAME ; по сути три выборки в переменные и выдача селектом одной строкой .... т.е. в mysqli после вызова процедуры через call всегда в цикле прверять more_results() нужно, даже если ты уверен, что результат был один ? или я опять что-то не допонял ? Добавлено спустя 13 минут 48 секунд: хотя ... попытка зафетчить второй резльтат ничего нет дает, пусто там, т.е. что , принипиально указатель списка результатов обзательно дернуть ? итого дополнил класс еще одно функцией для этого, дабы в коде циклов не писать : Код (Text): //освободить лишние результаты function clear(){ while ($this->more_results()) { $this->next_result(); } } но сдается мне что это таки изврат от недопонимания мной чего-то ... итого на выходе работает : Код (Text): <?php require_once('./lib/rpsql.class'); $sql=new rpsql(); //$result=$sql->query("select * from vendors"); //$result=$sql->query("call select_navi_names(5,1,3)"); $sql->real_query("call select_navi_names(5,1,3)"); $result=$sql->store_result(); listtable($result); $result->close(); $sql->clear(); $result=$sql->query("select * from groups"); listtable($result); ?>