2015-05-08 59 views
4

我是新的存储过程,并使用MySQL。我正在phpmyadmin中创建程序。外存储过程的每一行的存储过程

我需要实现的是一个存储过程,它将从链接表中的一个表及其关联关系中返回所有用户的详细信息。

我需要我的PHP的Web服务调用的程序,并能返回类似下面这样的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); 
       } 

和错误的警告:mysql_fetch_array()预计参数1是资源,鉴于参照线'while ($InnerRow = mysql_fetch_array($relations_results)){'布尔。我知道,当我打印出与该查询相关联的错误,我检索以上即规定错误消息命令不同步

+0

关系表是怎么样的? 看起来像一个简单的'JOIN'给我。 – mwilczynski

+0

对不起,好像不是你要求的。我们可以看到MySQL文件获取部分的PHP文件吗?似乎是PHP的问题,而不是在连接器上发布结果集。 – mwilczynski

+0

@m_wilczynski将更新问题 – user2363025

回答

0

我掏了一点,似乎连接到MySQL数据库的旧mysql方式是一次不支持多个存储过程。不是没有多个连接(你可能会猜到)是一个不太好的主意。 你可能会留在mysql,我不建议作为PHP文档说:

这个扩展不赞成PHP 5.5.0的,并会在将来被移除。相反,应该使用MySQLi或PDO_MySQL扩展。 另请参见MySQL:为更多 信息选择API指南和相关FAQ。替代该功能包括:

mysqli_query()

PDO ::查询()

如:http://php.net/manual/en/function.mysql-query.php

这就是我所理解你目前的数据模型:

Link to SQLFiddle

推荐的解决方案:

我会建议去更新和新mysqlimysql可能会在一段时间内从PHP消失的。

第二推荐的解决方案:

你也可以两个存储过程连接成一个。只需在userID上加入SELECT中的两个表格,然后使用您提供的参数进行查询。 另外,我可以在您的存储过程中看到UserIDParam,但无法在您的代码中看到它。无论如何,记住要防止自己从SQL注入。 存储过程并不总是保护你从这样的: http://blogs.msdn.com/b/brian_swan/archive/2011/02/16/do-stored-procedures-protect-against-sql-injection.aspx

不推荐的解决方案 - 选择:

首先获得所有用户的一次。 使用后设置的清除结果。 然后用第二个存储过程getRels迭代此结果。

+0

我的问题是,每个用户都可以拥有关系(长度各不相同)的ARRAY,所以我不确定如何实施您提供的第二个建议的解决方案? – user2363025

+0

如果您在用户标识上连接两个表,然后使用参数查看,则会得到相同的结果:给定用户(您作为参数传递的用户)的关系结果集。 – mwilczynski

+0

类似'SELECT * FROM Users JOIN关系ON关系.userID = Users.userID ORDER BY userName DESC';我不知道你在一般情况下使用了什么参数,但是如果你愿意,你可以添加'WHERE'子句。 – mwilczynski