为什么我不能使用mysqli函数选择特殊字符?

时间:2011-09-17 02:25:48

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

我一直在寻找答案,但到目前为止还没有找到答案......

我正在为客户构建一个网站,并使用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();

2 个答案:

答案 0 :(得分:0)

你应该使用

query("SET NAMES utf8");  

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

还要确保

您为表/ db

设置了正确的存储编码
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显示。这应该可以解决你的问题。

答案 1 :(得分:0)