【问题标题】:Executing OPENQUERY to pull data from MySql Server and inner joing it to SQL table from php script using PDO?执行 OPENQUERY 以从 MySql Server 中提取数据并使用 PDO 从 php 脚本将其内部连接到 SQL 表?
【发布时间】:2013-04-29 22:40:24
【问题描述】:

在尝试从 SQL Server 访问 MySql Server 的数据之后,我一直面临一个问题。 这是我到目前为止所做的。
1) 在我的 SQL Server 上安装 MySQL ODBC Driver 5.2w 2) 我从 Microsoft SQL Server Managment S (MSQLSMS) 创建了一个链接服务器 按照本网站上的说明 http://sql-articles.com/blogs/creating-linked-server-to-mysql-from-sql-server/

现在在我的 MSQLSMS 中,我打开了一个与名为“SERV1”的服务器的连接,我执行了以下查询,它运行正常。

SELECT
p.team_name,
p.fullname,
SUM( ISNULL(i.CallDurationSeconds, 0) ) AS totalTime
FROM OPENQUERY(SERVPHP, 'SELECT
                        CAST(t.name AS CHAR) AS team_name,
                        CAST(TRIM(REPLACE(CONCAT(su.first_name, " ", su.middle_name , " ", su.last_name), " ", " ")) AS CHAR) AS fullname,
                        CAST(su.login_user AS CHAR) AS username,
                        CAST(p.account_id AS UNSIGNED) AS account_id
                        FROM call_managment_system.phone_calls AS p
                        INNER JOIN call_managment_system.users AS su ON p.owner_id = su.user_id
                        INNER JOIN call_managment_system.teams AS t ON su.team_id = t.team_id
                        WHERE p.status = 2 AND t.client_id = 1 AND p.last_attempt_on BETWEEN "2013-01-01 08:00:00" AND "2013-04-30 07:00:00"
                        GROUP BY t.team_id, p.owner_id') AS p
INNER
JOIN OPENQUERY(SERVPHP, 'SELECT
                        CAST(cn.contact_number AS CHAR) AS phone_number,
                        CAST(cn.account_id AS UNSIGNED) AS account_id
                        FROM call_managment_system.contact_numbers AS cn
                        WHERE cn.contact_link = "Account"
                        UNION
                        SELECT CAST(cn2.contact_number AS CHAR) AS phone_number,
                        CAST(cn2.account_id AS UNSIGNED) AS account_id
                        FROM call_managment_system.contact_personal AS cp
                        INNER JOIN call_managment_system.contact_numbers AS cn2 ON cn2.person_id = cp.person_id AND cn2.contact_link = "Account" ') AS cn ON cn.account_id = p.account_id
INNER
JOIN I3_IC.dbo.CallDetail AS i ON p.username = i.LocalUserId AND RIGHT(i.RemoteNumber, 10) = cn.phone_number
WHERE i.I3TimeStampGMT BETWEEN '2013-01-01 08:00:00' AND '2013-04-30 07:00:00'
GROUP BY p.team_name, p.fullname

现在因为我使用 PHP 来执行这个查询。我做了以下 1) 使用 PDO api 连接到我之前执行此查询的 SQL 服务器“SERV1”。 2) 尝试执行上面列出的相同查询。 但是这次我遇到了我无法解决的错误。

致命错误:未捕获异常 'PDOException' 并带有消息“SQLSTATE[42000]:[Microsoft][SQL Server Native Client 10.0][SQL Server]无法初始化链接服务器的 OLE DB 提供程序“MSDASQL”的数据源对象“ SERVPHP"

请注意,“SERVPHP”是运行我的 PHP 应用程序和运行 MySql 服务器的服务器。 “SERV1”如果我的 SQL 服务器在哪里运行并且我在哪里安装了 ODBC 驱动程序。

更多, 当我从我的 PHP 应用程序以相同的方式运行此查询时,它可以工作

SELECT
LocalUserId AS loginName,
RemoteNumber AS PhoneNumber,
SUM(CallDurationSeconds) AS totalTalk
FROM CallDetail
WHERE LocalUserId = 'test' AND
I3TimeStampGMT BETWEEN '2013-01-01 08:00:00' AND '2013-04-30 07:00:00'
GROUP BY LocalUserId, RemoteNumber

为什么它现在起作用了? 我需要什么才能从我的 PHP 服务器执行此查询?

谢谢

【问题讨论】:

  • 仅通过查看您的错误消息,您的服务器或主机似乎缺少服务器本机客户端,可以从 Microsoft 网站下载。不幸的是,您将不得不努力寻找,因为我在找到安装时遇到了很多麻烦
  • 尽管有错误消息,但如果您可以从 Management Studio 运行查询但不能从 php 运行查询,则可能是由于权限或缺少权限。
  • @DanBracuk 当我设置 MSSQL PDO 的驱动程序时;由于缺少驱动程序,我无法从 PHP 执行任何查询
  • @DanBracuk 我在发布这个问题之前已经进行了研究,并且夫妇确实提出了一些建议。如何查看权限?
  • @DarylGill 我在不使用 OPENQUERY 的情况下执行了不同的查询并且它有效。我已将该查询添加到我上面的问题中。

标签: php mysql sql odbc openquery


【解决方案1】:

使用上面 cmets 中的建议,我发现这是一个权限问题。

我必须转到链接服务器属性并单击左侧的“安全”菜单。 然后我必须添加用户和密码。我还选择了“使用登录的当前安全上下文进行制作”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多