2015-05-08 2 views
4

Я новичок в хранимых процедурах и использую mysql. Я создаю процедуры в phpmyadmin.хранимая процедура для каждой строки внешней хранимой процедуры

Что мне нужно для достижения - это хранимая процедура, которая вернет все данные пользователя из одной таблицы и связанные с ними отношения в таблицу ссылок.

мне нужен PHP веб-сервис для вызова процедуры и быть в состоянии вернуть JSON, подобный следующему:

{ 
    "userID": "2222", 
    "userName": "mr x", 
    "userAddress": "street, town, County", 
    "userMobile": "1111", 
    "userPhone2": "2222", 
    "latitude": "53.2802937", 
    "longitude": "-9.0515995", 
    "relations": [ 
     { 
      "relID": "3333", 
      "relFName": "Mr", 
      "relSName": "rel1", 
      "relAddress": "street2, town2, county2", 
      "relPhone": "3333", 
      "relPhone2": "3333", 
      "relType": "Brother" 
     }, 
     { 
      "relID": "4444", 
      "relFName": "ms", 
      "relSName": "rel4", 
      "relAddress": "street 4, town 4, county 4", 
      "relPhone": "4444", 
      "relPhone2": "4444", 
      "relType": "Friend" 
     } 
    ] 
} 

Я в настоящее время есть две хранимые процедуры, т.е.

getUsers:

BEGIN 

SELECT * FROM Users ORDER BY userSName DESC; 

END 

and getRels:

BEGIN 

SELECT * FROM relations WHERE relations.userID = UserIDParam; 

END 

Но я не уверен, как связать их, прежде чем использовать sps, у меня было два запроса. Внешняя полученная информация пользователя и внутренний запрос выполнялись для каждой строки в наборе результатов первого, то есть получения массива отношений для каждого пользователя. Однако, когда я переключился с базовых запросов на вызовы хранимых процедур, я получаю ошибку, что команды не синхронизированы.

Я не могу найти пример того, чего я пытаюсь достичь. Любая помощь приветствуется

UPDATE код PHP выглядит так:

$fetch = mysql_query("CALL getUsers();"); 

       while ($row = mysql_fetch_array($fetch)){ 

         $GetRelations_Query = "CALL getRels();"; 
         $relations_results=mysql_query($GetRelations_Query); 
         $relations_arr = array(); 

         while ($InnerRow = mysql_fetch_array($relations_results)){ 

          $relationsReturned = array('relID' =>$InnerRow['personID'], 'relFName' => $InnerRow['FName'], 'relSName' => $InnerRow['SName'], 
          'relAddress' => $InnerRow['Address'], 'relPhone' => $InnerRow['Phone'], 'relPhone2' => $InnerRow['Phone2'], 'relType' => 
          $InnerRow['relationship']); 

          array_unshift($relations_arr,$relationsReturned); 
         } 


          $row_array = array('userID' => $row['userID'], 'userName' => $row['userName'].' '.$row['userSName'], 'userAddress' => $row['userAddress'], 
          'userMobile' => $row['userMobile'],'userPhone2' => $row['userPhone2'], 'latitude' => $row['latitude'], 'longitude' => $row['longitude'], 'relations' => $relations_arr); 

          array_unshift($return_arr,$row_array); 
       } 

и ошибка Warning: mysql_fetch_array() ожидает параметр 1, чтобы быть ресурсом, логический дается со ссылкой на линии 'while ($InnerRow = mysql_fetch_array($relations_results)){'. Я знаю, что когда я распечатываю ошибку, связанную с этим запросом, я извлекаю сообщение об ошибке, указанное выше, т.е. команды из синхронизации

+0

Как выглядит таблица отношений? Похож на простое 'JOIN' для меня. – mwilczynski

+0

Прошу прощения, похоже, это не то, о чем вы просите. Можем ли мы увидеть файл PHP для загрузки mysql? Кажется, это скорее проблема с PHP, а не освобождение результирующего набора на коннекторе. – mwilczynski

+0

@m_wilczynski обновит вопрос – user2363025

ответ

0

Я немного выкапываю и кажется, что старый способ подключения к базе данных MySQL - не поддерживая несколько хранимых процедур сразу. Не обойтись без нескольких соединений, которые (как вы, наверное, догадывались), не очень хорошая идея. Вы могли бы остаться с mysql, что я не рекомендую, как PHP документы говорят, что:

Это расширение устаревший PHP 5.5.0, и будут удалены в будущем. Вместо этого следует использовать расширение MySQLi или PDO_MySQL. См. Также MySQL: выбор руководства по API и связанных с ним часто задаваемых вопросов для получения дополнительной информации .Альтернативы этой функции включают в себя:

mysqli_query()

PDO :: запрос()

Как и в: http://php.net/manual/en/function.mysql-query.php

Это, как я понимаю вашу текущую модель данных:

Link to SQLFiddle

Рекомендуемое решение:

Я бы рекомендовал пойти в обновленный и более поздние версии mysqlimysql, как, вероятно, исчезнет через некоторое время от PHP вообще.

Второе рекомендуемое решение:

Вы также можете подключить два хранимых процедур в одну. Просто присоедините две таблицы в одном SELECT по адресу userID и запросите использование параметра, который вы предоставляете. Также я могу видеть UserIDParam в вашей хранимой процедуре, но не вижу ее в вашем коде. В любом случае, не забудьте уберечь себя от SQL Injection. хранимые процедуры не всегда защищают вас от таких: http://blogs.msdn.com/b/brian_swan/archive/2011/02/16/do-stored-procedures-protect-against-sql-injection.aspx

Не рекомендуется решение - альтернатива:

Сначала получить все пользователи сразу. Очистить результаты после . Затем повторите этот результат со второй хранимой процедурой getRels.

+0

Моя проблема заключается в том, что каждый пользователь может иметь ARRAY отношений (разной длины), поэтому я не уверен, как реализовать второе рекомендованное вами решение? – user2363025

+0

Если вы подключаетесь к двум таблицам в userid, а затем смотрите с параметром, вы получите тот же результат: resultet отношений для данного пользователя (пользователь, который вы передали как параметр). – mwilczynski

+0

Что-то вроде 'SELECT * FROM Users JOIN relations ON relations.userID = Users.userID ORDER BY userName DESC'; Я не знаю, для чего вы используете параметр вообще, но вы можете добавить предложение WHERE, если хотите. – mwilczynski

Смежные вопросы