2

私はMS SQL ServerでPDOを学び始めています。このコードで接続:

$userDB = 'userBD';
$passwordDB = 'passwordDB';

try {
  $DBH = new PDO('mssql:dbname=spr_bank;host=hostname', $userDB, $passwordDB);
  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

}
catch(PDOException $e) {
    echo "<h1 style='font-weight:bold; color:red;'>Error. Can not connect to Database</h1>";
    file_put_contents('PDOErrors.log', date("Y-m-d H:i:s")." - ".$e->getMessage()."\n", FILE_APPEND);
    exit();
}

そして今、テーブルからデータを選択します:

      //simple query and binding with results
      $query = $DBH->prepare("SELECT name FROM spr_sotrudnik WHERE login = :login AND password = :password");

      $login = (isset($_POST['login']) === true) ? $_POST['login'] : '' ; // ? : shorthand for if else
      $password = (isset($_POST['password']) === true) ? md5($_POST['password']) : '' ; // ? : shorthand for if else

      // bind parameters - avoids SQL injection
      $query->bindValue(':login', $login);
      $query->bindValue(':password', $password);

      //try... if not catch exception
      try {
          // run the query
          $query->execute();

          while($rows = $query->fetch()){
            echo $rows["name"];
          }
      }
      catch(PDOException $e){
          echo $e->getMessage(), $e->getFile(), $e->getLine();
      }

ブラウザにアクセスすると、次のエラーが表示されます。

SQLSTATE[HY000]: 一般エラー: 10007 Unicode のみの照合順序の Unicode データまたは ntext データは、DB-Library (ISQL など) または ODBC バージョン 3.7 以前を使用してクライアントに送信できません。[10007] (重大度 5) [(null)]D:\www\sklad_new\inc\auth.php19

このクエリを書くと $query = $DBH->prepare(" SELECT CONVERT(VARCHAR(MAX),name) AS s FROM spr_sotrudnik WHERE login = :login AND password = :password");

エラーはありませんが、「?????」と表示されます。

どうすればこれを変更できますか?

4

1 に答える 1

2

DSN 文字列charsetのパラメータを省略しています:

$DBH = new PDO('mssql:dbname=spr_bank;host=hostname', $userDB, $passwordDB);

...したがって、おそらくツールチェーン全体でデフォルトのエンコーディングを使用しています。

いずれにせよ、PDO_DBLIBドライバーは実験的なものとして明確にタグ付けされており、次の通知が含まれています。

Windows では、SqlSrv を使用する必要があります。MS SQL の代替ドライバーは、Microsoft から入手できます: » http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx .

SqlSrv を使用できない場合は、PDO_ODBCドライバーを使用して Microsoft SQL Server および Sybase データベースに接続できます。これは、ネイティブ Windows DB-LIB が古く、スレッドが安全ではなく、Microsoft によってサポートされなくなったためです。

私の経験では、これはあらゆる種類の予期しない副作用が発生する可能性があることを意味します.

于 2013-10-14T09:23:54.077 に答える