包含磅(英镑)符号的POST变量会中断提交到MySQL数据库

时间:2013-02-09 17:05:36

标签: php mysql post encoding

我在我的Mac上使用一些称为“Minco”的跟踪软件,它具有一项功能,即软件记录的所有时间都可以发送到PHP脚本以添加到MySQL数据库。我有这个工作正常,使用POST方法将数据从软件发送到脚本,脚本将POST变量提交到数据库,即:

$sql = "INSERT INTO $table_name VALUES('','$_POST[title]', '$_POST[date]', '$_POST[start]', '$_POST[end]', '$_POST[minutes]', '$_POST[amount]', '$_POST[notes]', '$_POST[uid]', '$_POST[type]', '$_POST[hash]')";

当我将软件设置为包含'amount'变量时,我遇到了一个问题。这个变量包含一个(英镑)符号,当包含它时,它会中断所有其他变量到数据库的提交,即添加一个新行,但所有列都没有输入。

我假设这个问题与井号的编码/解码有关,但我不知道如何解决这个问题。有人可以建议我怎么做吗?

4 个答案:

答案 0 :(得分:2)

请使用列表和准备好的陈述。

如果目标列不期望HTML字符,则应在发送之前将其删除。

<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

/* check connection */
if (!$link) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$stmt = mysqli_prepare($link, "INSERT INTO $tableName (col1, col2, col3, col4) VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'ssss', $_POST[title], $_POST[date], $_POST[start], $_POST[end]);

/* execute prepared statement */
mysqli_stmt_execute($stmt);

printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt));

/* close statement and connection */
mysqli_stmt_close($stmt);

/* close connection */
mysqli_close($link);
?>

答案 1 :(得分:0)

你可以用不同的方式处理它

  • 使用mysql(i)_real_escape_string($_POST[])
  • $ amount = $ _POST [amount]';

    $ amount = str_replace('你的POUND SIGN','',$ amount);

并在字符串中使用$amount变量

  • 你也可以尝试这个'\$_POST[amount]\'

答案 2 :(得分:0)

很少有尝试。确实,当字符串用双引号括起来时,你可以直接在字符串中包含$变量,但是当你插入一个数组变量时,你必须将那个括在花括号中:

$myvar = "{$_POST['myvar']}";

我个人只会连接你的字符串,以便你可以使用mysql_real_escape_string()方法来转义进入MySQL的值。如下所示:

$sql = "INSERT INTO $table_name 
        VALUES('',
               '" . mysql_real_escape_string($_POST["title"]) . "', 
               '" . mysql_real_escape_string($_POST["date"]) . "', 
               '" . mysql_real_escape_string($_POST["start"]) . "', 
               '" . mysql_real_escape_string($_POST["end"]) . "', 
               '" . mysql_real_escape_string($_POST["minutes"]) . "', 
               '" . mysql_real_escape_string($_POST["amount"]) . "', 
               '" . mysql_real_escape_string($_POST["notes"]) . "', 
               '" . mysql_real_escape_string($_POST["uid"]) . "', 
               '" . mysql_real_escape_string($_POST["type"]) . "', 
               '" . mysql_real_escape_string($_POST["hash"]) . "')";

答案 3 :(得分:0)

如果您的页面使用的是ISO-8859-1编码,但您的数据库使用的是UTF-8编码,那么您将尝试将井号发送为0xA3字节,数据库将拒绝该字节作为无效的UTF-8序列。

使用UTF-8编码的页面的反向错误,但使用ISO-8859-1编码的数据库更难发现,因为数据库只会认为您发送的是0xC20xA3字节序列而不是U + 00A3字符。