欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

serv-u 数据库 database php pdo serv-u mssql suusers homedir Chinese_PRC_CI_AS,,,php为utf-8字符,出现多个问号乱码 每个中文一个乱码 AG chatgpt 有大用 有大大用 有大大大用


注意下面红色的字

如果您仍然希望继续使用ODBC连接MSSQL数据库,并且仍然遇到中文乱码问题,您可以尝试调整一些设置来解决问题。以下是一些可能的解决方法:

  1. 设置ODBC连接的字符集:您可以尝试在ODBC连接字符串中指定字符集,例如:

php

$dsn = "odbc:Driver={FreeTDS};Server=192.168.0.1;PORT=1433;Database={$database};UID=${uid};PWD=${pwd};TDS_Version=8.0;ClientCharset=UTF-8;"; $conn = new PDO($dsn);    


  1. 设置ODBC连接的客户端字符集:您可以尝试在连接后运行查询来设置客户端字符集,例如:

php

$conn = new PDO($dsn); $conn->exec("SET NAMES 'utf8';");    


  1. 检查数据库和表的字符集设置:确保数据库和表的字符集设置与PHP连接字符集一致,并且可以正确存储和显示中文字符。

如果尝试以上方法仍然无法解决乱码问题,请考虑对数据进行转换或处理,例如使用iconv函数将字符从一种编码转换为另一种编码。

请注意,由于ODBC驱动和MSSQL数据库的兼容性限制,可能无法完全消除乱码问题。如果无法解决问题,考虑尝试其他连接方式或驱动程序以获得更好的中文字符支持。


对于中文字段 无须使用 iconv 或 mb_convert_encoding 等方法进行转换


下面是我自己亲自做的

function _one_ftp_list($ip)
{
   
$output = '';

   
$ftp_connection_infos =  _get_ftp_connection_infos();
   
$uid = $ftp_connection_infos['uid'];
   
$pwd =  $ftp_connection_infos['pwd'];;
   
$databases = get_mssql_databases();
   
$database  = $databases[$ip];
   
$dsn = "odbc:Driver={FreeTDS};Server=192.168.0.1;PORT=1433;Database={$database};UID=${uid};PWD=${pwd};TDS_Version=8.0;ClientCharset=UTF-8;)";
   
$output .= "<a href='/ftp_list'>所有FTP列表</a>".'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.'FTP服务器的ip: '.$ip;
   
try {
       
$conn = new PDO($dsn);
       
$conn->exec("SET NAMES 'utf8';");
//        $conn->query("SET TEXTSIZE -1");
       
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
       
$sql = "SELECT COUNT(LoginID) as total FROM  [SUUsers]";
       
$stmt = $conn->prepare($sql);
       
$stmt->execute();
       
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
       
$total = $results[0]['total'];
       
$output .= '<br />';
       
$output .= "总计:".$total."个";

       
$sql = "SELECT LoginID,HomeDir,ExpiresOn, CONVERT(varchar, DATEADD(second,  CAST(ExpiresOn AS bigint)+8*3600, '19700101'), 23) AS ExpiresOn_Human,
             
CONVERT(varchar, DATEADD(second,  CAST(StatisticsStartTime AS bigint)+8*3600, '19700101'),23) AS StatisticsStartTime_Human
                FROM  [SUUsers] ORDER BY  StatisticsStartTime DESC "
;
       
$stmt = $conn->prepare($sql);
       
$stmt->execute();
       
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

       
$output .= '<br />';
       
$output .= '<br />';
       
$output .= '<table>';
       
$output .= '<tr>';
       
$output .= '<th>帐号</th>';
       
$output .= '<th>主目录</th>';
       
$output .= '<th>过期时间</th>';
       
$output .= '<th>创建时间</th>';
       
$output .= '<th>续期180天</th>';
       
$output .= '</tr>';




       
foreach($results as $key=>$value)
       {
           
$expires_on = !empty($value['ExpiresOn'])?$value['ExpiresOn']:'';

           
if(!empty($expires_on)){
               
if((time()+24*3600)>=$expires_on){   // 为了安全  假如明天这个时候   >   过期时间,就算过期了
                   
$error_style = "style='color:red'";
               }
else{
                   
$error_style = "";
               }
           }

           
$output .= '<tr>';
           
$output .= "<td {$error_style}>{$value['LoginID']}</td>";
           
//无段下面的iconv 或 mb_convert_encoding 的 转换
//            $output .= "<td {$error_style}>". iconv("GBK", "UTF-8", $value['HomeDir'])."</td>";
//            $output .= "<td {$error_style}>". iconv('CP936', 'UTF-8//IGNORE', $value['HomeDir'])."</td>";
//            $output .= "<td {$error_style}>".mb_detect_encoding( $value['HomeDir'], array("GBK","GB2312","BIG5","ASCII","UTF-8")). mb_convert_encoding($value['HomeDir'], 'UTF-8', 'CP936')."</td>";
           
$output .= "<td {$error_style}> {$value['HomeDir']}</td>";
           
$output .= "<td {$error_style}>{$value['ExpiresOn_Human']}</td>";
           
$output .= "<td {$error_style}>{$value['StatisticsStartTime_Human']}</td>";
           
$output .= "<td {$error_style}> <a href=\"javascript:ftp_renewal('{$value['LoginID']}','{$ip}');\" onclick=\"return window.confirm('确定要给{$value['LoginID']}续期180天吗?')\">  续期</a> </td>";
           
$output .= '</tr>';
       }
       
$output .= '</table>';
       
return $output;
   }
catch (PDOException $e) {
       drupal_set_message(
'Connection failed: ' . $e->getMessage(),'error');
   }
}


可能对  php.ini 的 mbstring 扩展的启用 也会起到作用吧

 # vim /www/wdlinux/phps/56/etc/php.ini

........................................................................................

extension=php_mbstring.dll

........................................................................................

普通分类: