【发布时间】: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