【问题标题】:Why can't I select special characters using mysqli functions?为什么我不能使用 mysqli 函数选择特殊字符?
【发布时间】:2011-09-17 02:25:47
【问题描述】:

我这几天一直在寻找答案,到现在还没有找到答案……

我正在为客户建立一个网站,并且正在使用 MySQL 数据库来存储菜单数据,并且正在使用 PHP mysqli 准备好的语句来处理数据库。当我使用表单更新或添加行时,特殊字符插入错误,重音“é”字符在提交时变为 é。不过,如果我通过 phpMyAdmin 手动输入它们,它们就会显示得很好。

按照这里的建议,在 $mysqli 对象之后添加它,我有点幸运

$mysqli -> set_charset( "utf8" );

这似乎只适用于更新和插入命令,现在选择的任何内容都显示“tilda A copyright”代替带重音的 e,所以它基本上是相同的问题,但相反。

这是我的一些受影响的 PHP:

$mysqli = new mysqli( "localhost", "user", "pass", "db" );
$mysqli -> set_charset( "utf8" );

if( $_GET['mode'] == "edit" && $_GET['drink'] && $_POST['e_name'] ) {
    $update = "update `menu` set `name` = ?, `description` = ?, `small` = ?, `medium` = ?, `large` = ?, `flavors` = ?, `section` = ?, `order` = ? where `id` = ?;";

    $id = $_GET['drink'];
    $nName = $_POST['e_name'];
    $nDesc = $_POST['e_desc'];
    $nSml = $_POST['e_prc1'];
    $nMed = $_POST['e_prc2'];
    $nLrg = $_POST['e_prc3'];
    if( $_POST['e_flav'] == "on" )
        $nFlv = 1;
    else
        $nFlv = 0;
    $nSect = $_POST['e_sect'];
    $nOrd = $_POST['e_ordr'];

    if( $changeIt = $mysqli -> prepare( $update ) ) {
            $changeIt -> bind_param( 'ssdddiiii', $nName, $nDesc, $nSml, $nMed, $nLrg, $nFlv, $nSect, $nOrd, $id );
        $changeIt -> execute();
    }

    header( "Location: http://stackoverflow.com/" );
    exit;
}

$mysqli -> close();

【问题讨论】:

    标签: php mysql character-encoding mysqli special-characters


    【解决方案1】:

    你应该使用

    query("SET NAMES utf8");  
    

    SET NAMES 指示客户端将使用什么字符集将 SQL 语句发送到服务器。因此,SET NAMES 'utf8' 告诉服务器,“来自该客户端的未来传入消息采用字符集 utf8。”它还指定服务器用于将结果发送回客户端的字符集。 (例如,如果您使用 SELECT 语句,它会指示用于列值的字符集。)

    还要确定

    你为你的表/数据库设置了正确的存储编码

    CREATE TABLE{
    ...
    }CHARSET=utf8;
    

    CREATE DATABASE  DEFAULT CHARACTER SET utf8
    

    您的 html 输出是 utf-8 字符集。

    Content-Type: text/html;charset=utf-8
    

    现在,您的数据库/表将以 utf-8 格式存储值。数据将以 utf-8 格式发送和接收,页面将以 utf-8 格式显示。这应该可以解决您的问题。

    【讨论】:

    • 感谢您的回复!不幸的是,我已经尝试了所有这些并确保一切都是正确的,但我得到了相同的结果...... =/
    • 啊,我想我已经弄明白了,不过,我不太确定为什么会这样......我用 set_charset 函数和“utf8_general_ci”代替了以前的函数,这只是“utf8”,这是我在这里阅读另一页后添加的。
    • 其实,它似乎毕竟没有工作......它只是回到我之前的位置,选择工作,并且更新/插入不起作用...... =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2012-09-09
    • 2014-01-27
    相关资源
    最近更新 更多