【问题标题】:Cannot get record to insert into mysql data using PHP无法使用 PHP 获取记录以插入 mysql 数据
【发布时间】:2012-08-09 17:40:15
【问题描述】:

我正在使用 PHP 来填充公司记录的数据库。我有一个公司名称和他们使用的货币类型的字段。
但是当我使用 PHP 时,如果货币是英语英镑符号 (£),则永远不会插入记录。美元符号 ($) 或任何其他正常字符都没有问题。当我运行 sql 语句并将其直接输入 MySQL 查询浏览器时,带有井号的记录插入得很好。但是当我在 PHP 中运行完全相同的 INSERT 语句时,它就不起作用了。

$sql = "INSERT INTO company_test (name, currency) VALUES ('ABC Widgets', '£')";   
$rs = mysql_query($sql, $conn);
//Does not insert a record

$sql = "INSERT INTO company_test (name, currency) VALUES ('ABC Widgets', '$')";   
$rs = mysql_query($sql, $conn);
//A record inserts just fine

//My MySQL version is 5.5.11.  PHP is version 5.3.6.  
//The MySQL table looks like this:
TABLE company_test
FIELD | id       | INTEGER(10) | not null | auto increment
FIELD | name     | VARCHAR(45) | not null
FIELD | currency | VARCHAR(3)  

在 MySQL 查询浏览器中,“表选项”选项卡显示,对于这个 company_test 表,我的字符集是 utf8。

谢谢。

【问题讨论】:

  • PHP 脚本的字符集是什么? ASCII 还是 UTF8?你从 mysql 收到任何警告吗?你试过调用 mysql_error() 吗?
  • 这可能无助于回答您的问题,但您应该停止使用mysql_* 函数。它们正在被弃用。请改用PDO(PHP 5.1 起支持)或mysqli(PHP 4.1 起支持)。如果您不确定要使用哪一个,read this SO article.
  • 是否值得增加currency 字段的大小?我不知道是否将井号存储为一个字符或 £ 之类的东西,这不适合....
  • 请记住,£ 不是 ASCII 字符。正确插入记录需要匹配 PHP 中的字符集、数据库连接和数据库本身。
  • 还要检查 MySQL 数据库正在使用的字符集。可能不允许使用 £ 字符。将 PHP 排除在外,尝试在 MySQL 中执行相同的查询。

标签: php mysql


【解决方案1】:

检查错误:

$rs = mysql_query($sql, $conn) or die(mysql_error());
                               ^^^^^^^^^^^^^^^^^^^^^

永远不要假设查询成功。即使你的 sql 语法是完美的,也有太多其他的原因导致不检查。

【讨论】:

    【解决方案2】:

    经过一番谷歌搜索后,我终于找到了可行的方法。可能有类似情况的人创建了一个 PHP 函数来转换 sql 语句的字符集。
    现在我的查询在插入之前看起来像这样: INSERT INTO company_test (name, currency) VALUES ('ABC Widgets', '£') 请注意井号前的有趣小字符。

    反正这里是函数:

    function TtoUtf8( &$string, $encType = 'ISO-8859-1' ) 
    { 
        $enc    = mb_detect_encoding( $string ); 
        $enc ? 
            $enc = $enc : 
            $enc = $encType; 
        if ( $enc == 'UTF-8' ) 
        { 
            return $string; 
    
            // end if $enc == UTF-8 
        } else 
        { 
            $conv = iconv( $enc, 'UTF-8//TRANSLIT', $string ); 
            $conv ? 
                $ret = &$conv : 
                $ret = &$string; 
            return $ret; 
        } 
    

    }

    【讨论】:

      【解决方案3】:

      你为什么不先把它转换成 htmlentities 或 htmlspecialchar:

      $currency = htmlspecialchars('£');
      $sql = "INSERT INTO company_test (name, currency) VALUES ('ABC Widgets', '{$currency}')"; 
      

      另外,您的货币字段是什么类型的数据类型?

      【讨论】:

      • 我将 curreny 字段的 varchar 大小增加到 10。这不起作用。货币字段是数据类型 utf8。我只是输出 mysql_error 的值并得到这个 -> 1366: Incorrect string value: '\xA3' for column 'currency' at row 1
      • htmlspecialchars nowhere 接近于为 SQL 转义。请使用正确的方法。
      • 是的,我尝试了 raygo 的 htmlspaecialchars 函数并收到同样的错误。
      • 试着把 SET NAMES latin1;在之前的 INSERT $sql = "SET NAMES latin1; INSERT INTO ..."
      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多