【问题标题】:MySQL Insert Double Quotes PHPMySQL 插入双引号 PHP
【发布时间】:2018-07-16 01:21:41
【问题描述】:

我正在使用下面准备好的语句插入 MySQL。如果我尝试使用包含 "(双引号)的 $descrip 插入内容,则插入将在此时停止。

示例: 试图插入16" Solid Steel Tube 表格行中的条目仅显示 16 并停在 "(双引号)处,不会显示 $descrip 的其余部分。

我做错了什么?

$stmt = $db->prepare("INSERT INTO line_items (quote_id, part, descrip, qty, price, net, notes, datasheet) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssssss", $quote_id, $part, $descrip, $qty, $price, $net, $notes, $datasheet);

foreach($_POST['part'] as $i => $item) {

    $part       = $item;
    $descrip   = $_POST['descrip'][$i];  //This wont enter something with double qutoes such as 16" Solid Steel Tube
    $qty        = $_POST['qty'][$i];
    $price      = $_POST['price'][$i];
    $net        = $_POST['net'][$i];
    $notes      = $_POST['notes'][$i];
    $datasheet  = $_POST['datasheet'][$i];

    $stmt->execute();
}   

编辑: 仅供参考-我正在从数据库中的另一个表中选择$descrip,该表在行中正确地具有16" Solid Steel Tube。当我尝试通过我准备好的语句将该项目复制到另一个表中时,它不会正确插入。

【问题讨论】:

  • @Satya 不,这不应该是必需的
  • 您如何验证问题?您在哪里看到不正确/截断的值?你确定$_POST['descrip'][$i] 包含期望值吗
  • @marekful 不,你肯定!此外,OP 正在使用 MySQLi。带有绑定参数的准备好的语句应该能够接受任何输入值而无需特殊引用或转义
  • 能否请大家停止建议转义/特殊引用。 不需要
  • 对观察到的行为最可能的解释是$descrip 仅包含字符串'16'。我们需要使用 PDO::quote,或者在双引号前添加反斜杠,或者使用 mysqli_real_escape_string 的建议是错误。这些都不需要。设置一个显示这一点的测试很简单。只需将 $descrip 设置为文字值即可。例如$descrip = '16" Test'; 这将证明不是bind_param 导致字符串在双引号处被截断。问题在于分配给 $descrip 的值。

标签: php mysql mysqli prepared-statement bindparam


【解决方案1】:

根据您的提示...

我正在从数据库中的另一个表中选择$descrip,该表在行中正确地将其作为'16" 实心钢管'。当我尝试通过我的将该项目复制到另一个表中时准备好的语句,即它不会正确插入。

我想你正在以这样的形式使用这个值(但可能不完全)

<input type="text" value="<?= $descrip ?>" name="descrip[]">

这里的问题是呈现的 HTML 看起来像

<input type="text" value="16" Solid Steel Tube" name="descrip[]">

注意value 属性现在在 "16" 之后有一个结束引号?


您需要对值进行编码以便在 HTML 中安全使用。试试……

<input type="text" value="<?= htmlspecialchars($descrip) ?>" name="descrip[]">

这将呈现像

<input type="text" value="16&quot; Solid Steel Tube" name="descrip[]">

您的 PHP 脚本在提交时仍会将其作为未编码的字符串接收。

【讨论】:

  • +10。毫无疑问,$descrip 的值解释了观察到的行为。 OP 错误地断定是 MySQL / 准备好的语句 / bind_param 导致字符串被截断。
  • @spencer7593 是的,这就是为什么我要求 OP 验证 $_POST['descrip'][$i] 的值,但在他们添加了额外信息后,我认为问题似乎很明显。
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2014-09-19
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多