【问题标题】:stored procedure for each row of an outer stored procedure [duplicate]外部存储过程的每一行的存储过程[重复]
【发布时间】:2015-07-19 03:26:17
【问题描述】:

我是存储过程的新手,正在使用 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"
        }
    ]
}

我目前有两个存储过程,即

获取用户:

BEGIN

SELECT * FROM Users ORDER BY userSName DESC;

END

和getRels:

BEGIN

SELECT * FROM relations WHERE relations.userID = UserIDParam;

END

但我不确定如何链接它们,在使用sps之前,我有两个查询。外部检索用户详细信息,内部查询针对第一个结果集中的每一行执行,即获取每个用户的关系数组。但是,当我从基本查询切换到调用存储过程时,我收到命令不同步的错误。

我似乎找不到我想要实现的目标的示例。任何帮助表示赞赏

更新 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)){' 行。我知道当我打印出与该查询相关的错误时,我正在检索上述错误消息,即命令不同步

【问题讨论】:

  • 关系表是什么样子的?对我来说看起来像一个简单的JOIN
  • 对不起,这似乎不是您要的。我们可以看到 mysql 获取部分的 PHP 文件吗?似乎是相当 PHP 的问题,并且没有在连接器上发布结果集。
  • @m_wilczynski 将更新问题
  • 现在一切都清楚了。请看我的回复。
  • 我会推荐另一种解决方案的小更新,第二个我不会(但仍然应该工作)。

标签: php mysql stored-procedures phpmyadmin


【解决方案1】:

我挖掘了一下,似乎旧的mysql 连接到 MySQL DB 的方式是不支持多个存储过程。并非没有多个连接,这(您可能会猜到)不是一个好主意。 您可能会继续使用我不推荐的 mysql,因为 PHP 文档是这么说的:

此扩展自 PHP 5.5.0 起已弃用,将来将被删除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。 另请参阅 MySQL:选择 API 指南和相关常见问题解答以了解更多信息 信息。此功能的替代方案包括:

mysqli_query()

PDO::query()

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

这是我对您当前数据模型的理解:

Link to SQLFiddle

推荐解决方案:

我建议去更新和更新mysqli,因为mysql 可能会在一段时间内从 PHP 中消失。

第二个推荐的解决方案:

您还可以将两个存储过程合二为一。只需在userID 上将两个表合并为一个SELECT 并使用您提供的参数进行查询。 我也可以在您的存储过程中看到UserIDParam,但在您的代码中看不到它。无论如何,请记住防止自己被 SQL 注入。 存储过程并不总是可以保护您免受以下情况的影响: http://blogs.msdn.com/b/brian_swan/archive/2011/02/16/do-stored-procedures-protect-against-sql-injection.aspx

不推荐的解决方案 - 替代方案:

首先一次获取所有用户。 使用getUsers 后清除结果集。 然后用第二个存储过程getRels 迭代这个结果。

【讨论】:

  • 我的问题是每个用户都可以有一个关系数组(长度不同),所以我不确定如何实施您提供的第二个推荐解决方案?
  • 如果你在 userid 上加入两个表,然后用参数查看,你会得到相同的结果:给定用户的关系结果集(作为参数传递的用户)。
  • 类似SELECT * FROM Users JOIN relations ON relations.userID = Users.userID ORDER BY userName DESC;我不知道您一般使用该参数是为了什么,但如果您愿意,可以添加 WHERE 子句。
  • 也许我遗漏了什么,或者我没有解释自己。用户 A 可以有 7 个关系,每个关系都有自己的一组关联详细信息。您的查询的编写方式,它只允许每个用户一个关系?还是我错过了什么?
  • 不,它不会那样限制它,只要它是 1:N 关系。但这取决于您的关系表的外观。它是否与用户表定义了关系?如果您不知道,您至少可以提供关系表中的列吗?
猜你喜欢
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多