【问题标题】:odbc_pconnect works but PDO gives errorodbc_pconnect 工作,但 PDO 给出错误
【发布时间】:2016-07-03 13:15:21
【问题描述】:

我在 CentOS 服务器上通过 unixODBC 和 FreeTDS 建立了到 Sybase DB 的连接。 (我不拥有 Sybase 服务器,我只有一个具有只读权限的帐户)

TL;DR:我可以同时连接odbc_pconnect 和 PDO,但是当我执行相同的查询时,odbc_pconnect 工作,而 PDO 返回错误

全文:我使用odbc_pconnect创建了一个简单的测试

$query = "select COUNT(*) from table_name";

$conn = odbc_pconnect("myDSN", 'myusername', 'mypassword');

if(!$conn) 
    die("Connection failed");
if($result = odbc_exec($conn, $query)) 
{
    odbc_result_all($result);
}

上面的代码有效,我得到了我想要的计数。

然后我尝试使用 PDO

$connectionstring = "odbc:myDSN;";
try {
    $db = new \PDO(
    $connectionstring , 'myusername', 'mypassword');
} catch (PDOException $e) 
{
    echo 'Connection failed: ' . $e->getMessage();
}
$rs = $db->query($query);
debug($db->errorInfo());

连接已建立(没有“连接失败”错误),但随后服务器返回错误:

[FreeTDS][SQL Server]ASA 错误 -121:权限被拒绝: 您无权使用“CREATE PROCEDURE”语句 (SQLExecute[262] at /builddir/build/BUILD/php-5.4.16/ext/pdo_odbc/odbc_stmt.c:254)

好吧,正如您所见,我的查询不会尝试创建任何过程

我尝试了不同的连接字符串,但结果没有改变

我猜问题出在我的 odbc 和 freeTDS 配置中,而不是 PHP 中。但问题仍然存在:为什么会有不同的行为?

edit 我在尝试从控制台访问数据源时发现了同样的问题:如果我尝试使用 tsql

tsql -S myDSN -U myusername -P mypassword

我可以执行查询。但是当我使用isql访问时:

isql -v myDSN myusername mypassword 

我得到了和上面一样的错误:

[42501][FreeTDS][SQL Server]ASA 错误 -121:权限被拒绝:您没有使用“CREATE PROCEDURE”语句的权限 [ISQL]错误:无法执行 SQL

我猜是和this有关

PS 我正在使用 cakephp 3.1.11

【问题讨论】:

  • 没有。我不知道它来自哪里
  • 可能与this相关?
  • 您可以分享这个$query 值吗?
  • 问题出在:这是一个简单的选择查询:$query = "select COUNT(*) from table_name";
  • 你检查过phpinfo,你是否安装/配置了pdo odbc驱动程序?

标签: php pdo sybase freetds unixodbc


【解决方案1】:

您可能不会创建过程,但 CakePHP 可能会在后台为您创建。如果您只有读取权限,则无法创建过程,source:

以下描述了根据您的细化权限设置而不同的创建过程(也包括创建扩展过程时)的权限检查。

已启用细化权限 - 您必须具有创建过程权限。您必须具有 create any procedure 权限才能为其他用户运行 create procedure。

已禁用细化权限 - 您必须是数据库所有者或拥有创建过程权限。

【讨论】:

  • 感谢您的回答。正如您从我的代码中看到的那样,我不使用 cakePHP,但我直接使用 PDO。当然,如果我使用 cake 的 ORM(这就是我想要做的,最后)我会得到与 cake 内部使用 PDO 相同的错误
  • 您还链接了 MySQL 文档中的一个页面,但我想通过 unixODBC 和 FreeTDS 连接到 SyBase 服务器
  • 你说得对,不过都差不多,我会更新答案
  • 正如我告诉你的,我没有使用 cake ORM,所以它不是蛋糕创建过程:它必须是 PDO 或 odbc 驱动程序。我知道我需要拥有创建过程的权限,但问题是:为什么我只想执行一个简单的 SELECT 查询时会创建过程?
  • 这是您编程失败的地方:github.com/php/php-src/blob/master/ext/pdo_odbc/…。 (SQL_NO_DATA_FOUND 或 SQL_SUCCESS_WITH_INFO)。如果没有完整的跟踪,我不确定您的代码错误在哪里。 rc 是 SQLExecute(S->stmt) 的乘积; (第 173 行)这意味着您的语句或查询可能是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2021-04-01
  • 2014-10-06
  • 2015-04-17
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多