【问题标题】:simple select returns unexpected result简单的选择返回意外的结果
【发布时间】:2013-06-27 07:30:33
【问题描述】:

运行此代码返回意外结果

<?php
error_reporting(-1);
try{
    $pdo = new PDO('odbc:Driver={SQL Server Native Client 11.0};Server=192.168.178.11;Database=test;','sa', 'secret');
    $s = $pdo->prepare('SELECT * FROM test');
    if($s->execute()){
        var_dump($s->fetchAll());
    }
    $s = $pdo->prepare('SELECT * FROM test WHERE id = ?');
    if($s->execute(array(1))){
        var_dump($s->fetchAll());
    }
}catch(Exception $e){
    echo $e->xdebug_message;
}

返回

array (
    0 => 
    array (
      'id' => '1',
      0 => '1',
      'test' => 'test      ',
      1 => 'test      ',
    ),
    1 => 
    array (
      'id' => '2',
      0 => '2',
      'test' => 'test2     ',
      1 => 'test2     ',
    ),
    2 => 
    array (
      'id' => '3',
      0 => '3',
      'test' => 't3        ',
      1 => 't3        ',
    ),
)

如您所见,第二条语句失败

(请注意,我正在运行 gentoo linux 64,并且我在 win7 64 虚拟机上连接到 SQL Server 2012)

【问题讨论】:

  • 您是否收到任何错误消息?
  • 目前看来是 SQL Server 的 unix ODBC 驱动程序的一个错误已解决

标签: php sql-server linux pdo odbc


【解决方案1】:

我使用 MySQL 获得第二条语句。您可能需要使用 SQL Server 在使用 closecursor 的语句之间释放与服务器的连接。

$pdo = new PDO('odbc:Driver={SQL Server Native Client 11.0};Server=192.168.178.11;Database=test;','sa', 'secret');
    $s = $pdo->prepare('SELECT * FROM test');
    if($s->execute()){
        var_dump($s->fetch());
    }
    $s->closeCursor();// ADD THIS for SQL Server
    $s = $pdo->prepare('SELECT * FROM test WHERE id = ?');
    if($s->execute(array(1))){
        var_dump($s->fetch());

PS fetch() 仅获取 1 行。 var_dump() 中应该只有 1 个 id

【讨论】:

  • jah 我后来将其更改为 fetchAll(问题已更新),没有工作 doh:(
  • 您是否尝试在语句之间添加closeCursor()。正如我在回答中所说,我在没有 closeCursor() 的情况下使用 MySQL 得到相同的 var_dump() 结果。使用fetchAll()fetch() 都应该产生结果。
  • @borrel 尝试使用 fetchAll() 进行查询。两个语句都产生了预期的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多