【发布时间】:2013-10-14 07:21:20
【问题描述】:
我开始使用 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");
我没有错误,但我看到“?????”
我该如何更改?
【问题讨论】:
-
你在用什么driver? PDO_DBLIB、PDO_ODBC 还是 PDO_SQLSRV?
-
我认为这是 driver ,但我不确定。如何查看?
-
对不起,我真的不需要问,因为你已经显示了 DNS:
mssql:...。您正在使用PDO_DBLIB。 -
糟糕...我的意思是 DSN,不是 DNS...
-
VARCHAR 不是 unicode,它是 ASCII。我敢打赌
name是一个 NVARCHAR 字段,您正在使用与存储数据不兼容的代码页将其强制转换为 ASCII。默认代码页与数据库的排序规则相匹配。您可以使用 COLLATE 子句使用特定的排序规则,但真正的解决方案是使用支持 Unicode 的驱动程序
标签: php sql-server encoding pdo