包含英镑符号的POST变量会中断向MySQL数据库的提交


POST variable containing a pound (sterling) sign breaks submission to MySQL database

我在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]')";

不过,当我将软件设置为包含"金额"变量时,我遇到了一个问题。此变量包含一个英镑(Sterling)符号,当包含时,它会中断所有其他变量向数据库的提交,即添加了一个新行,但所有列都没有输入任何内容。

我假设这个问题与英镑符号的编码/解码有关,但我不确定如何解决这个问题。有人能建议我怎么做吗?

请使用列列表和准备好的语句。

如果目标列不需要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);
?>

您可以用不同的方式处理

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

    $amount=str_replace('YOUR POUND SIGN','',$amount);

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

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

很少有东西可以尝试。确实,当字符串用双引号括起来时,您可以直接在字符串中包含$variables,但当您插入数组变量时,您必须用大括号括起:

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

我个人只想连接你的字符串,这样你就可以使用mysql_real_eescape_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"]) . "')";

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

页面使用UTF-8编码,而数据库使用ISO-8859-1编码,这是一个相反的错误,因为数据库只会认为你发送的是0xC20xA3字节序列,而不是U+00A3字符。