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,Microsoft 提供了 MS SQL 的替代驱动程序:» 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 回答