首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从PHP插入特殊字符到Microsoft

从PHP插入特殊字符到Microsoft
EN

Stack Overflow用户
提问于 2012-09-17 15:13:14
回答 1查看 4.7K关注 0票数 1

我刚刚创建了一个MSSQL数据库。校对是SQL_Latin1_General_CP1_CS_AS。我是在服务器上使用freetds的.当我收到来自web表单的文本,并且尝试插入包含特殊字符(例如咖啡馆)的文本时,我会得到一个错误。

代码语言:javascript
运行
复制
<?php
ini_set('display_errors', '1') ;
$MyConn = mssql_connect( "MSPROD", "one", "1a!logas1" ) ;
mssql_select_db( "SIAM", $MyConn ) ;
if ( isset( $_GET['arg'] ) )
    {
    $arg = $_GET['arg'] ;
    print "Inserting '$arg'<br>\n" ;
    for ( $i = 0 ; $i < strlen( $arg ) ; $i ++ )
        {
        print dechex( ord( $arg{$i} ) ) . ' ' ;
        }
    mssql_query( "INSERT mytest VALUES('$arg')" ) ;
    }
?>
<form action=badchars.php method=get>
<input type=text name=arg>
</form>

这是一个错误:

插入'café‘63 61 66 e9警告: mssql_query():Sybase: Server消息:在字符串'caf’后插入未关闭引号。(严重性15,过程N/A)在第13行的/www/one/mytest/badchars.php中警告: mssql_query():Sybase: Server消息:在'caf‘附近的不正确语法。(严重性15,过程N/A)在第13行/www/one/mytest/badchars.php中

它提到Sybase是因为服务器最初是为它安装的,但据我所知,Sybase和Mssql函数是相同的,所以不重要。如果我试图将文本限制在引号中,我仍然会得到相同的错误:

代码语言:javascript
运行
复制
mssql_query( "INSERT mytest VALUES('café')" ) ;

但是,如果我在Server管理器中运行相同的查询,它就能工作!这样做是可行的:

代码语言:javascript
运行
复制
mssql_query( "INSERT mytest VALUES('caf' + char(233) )" ) ;

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2012-09-17 15:23:54

我强烈建议您停止使用php_mssql,而是获取Microsoft Drivers for PHP for SQL Server,我们在php_mssql中遇到的几乎任何问题都将得到解决,在使用php_mssql向Server发送和从Server发送和获取UTF-8数据时,会遇到很多麻烦。

在选择文本和nText时,必须强制转换php_mssql和nVarchar,因为php_mssql只支持旧的Server驱动程序.

如果您确实需要使用php_mssql,那么您必须使用iconv,或者utf8_decode。下面是我为在Server中存储和获取UTF-8波斯/阿拉伯数据而编写的两个函数。

代码语言:javascript
运行
复制
function persian_sql_to_php($str){
    if(mb_detect_encoding($str) == 'UTF-8' AND mb_check_encoding($str, 'UTF-8')){
        $str = utf8_decode($str);
    }
    $str = iconv('Windows-1256', 'UTF-8', $str);
    return $str;
}

function persian_php_to_sql($str){
    $str = iconv('UTF-8', 'Windows-1256', $str);
    return $str;
}

您将需要根据所使用的语言将Windows1256更改为其他内容。另外,单独尝试utf8_decodeutf8_encode,也许它们适合您的情况。

更新:

由于您使用的是FreeTDS,所以情况可能与我前面解释的关于UTF-8的问题的主php_mssql略有不同.

更新2: --我刚刚在上尝试了这段代码,它看起来很有效,你也能试试吗,也许它也适用于你?

代码语言:javascript
运行
复制
<?php

mssql_connect('127.0.0.1', 'sa', '123456');
mssql_select_db('test');

$val = 'café';

$val = iconv('UTF-8', 'ISO-8859-1', $val);

mssql_query('INSERT INTO mytest (test) VALUES (\''.$val.'\');');

?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12462218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档