0

このコードを実行すると、予期しない結果が返されます

<?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        ',
    ),
)

ご覧のとおり、2番目のステートメントは失敗します

(私はgentoo linux 64を実行していて、win7 64仮想マシンでSQLサーバー2012に接続していることに注意してください)

4

1 に答える 1

1

MySQL を使用して 2 番目のステートメントを取得します。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());

PSfetch()は 1 行のみをフェッチします。ID は 1 つだけにする必要がありますvar_dump()

于 2013-06-29T18:52:45.530 に答える