当使用预准备语句和值绑定在mysql中插入(或更新)记录时,我遇到了一个问题,试图插入包含扩展ascii字符145(右侧单引号)的单词child’s
。 “d”之后的所有数据都被截断。这适用于插入任何MS Word奇数字符。我的表编码为utf8_general_ci,我在代码中一直都是utf-8。该字段的类型为“text”。
当然我可以逃脱它们或者做str_replace()
删除它们(这是我选择做的),但是我想知道为什么我不能直接插入它们因为我一直以为准备好的陈述处理了这个。
示例插入代码 - 不完整,但它显示了必要的
$q = "INSERT INTO mytable (userid, title, descr) VALUES (?,?,?)";
if (!($stmt = $this->mysqli->prepare($q))) {
error_log("You have a problem...");
return false;
}
/* bind parameters for markers */
$stmt->bind_param("iss", $userid, $title, $descr);
/* execute query */
$stmt->execute();
if ($stmt->errno) {
$e = new Exception;
error_log("\r\nSql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error . "\r\n" . $e->getTraceAsString());
return false;
} else {
$lastinsertedid = $this->mysqli->insert_id;
/* close statement */
$stmt->close();
return $lastinsertedid;
}
答案 0 :(得分:0)
这应该不是问题,将param绑定为字符串应该根据需要转义任何引号。
尝试此操作,看看你是否能看到错误是什么。
$stmt = $this->mysqli->prepare($q);
if (!is_object($stmt))
error_log("You have a problem...");
var_dump($this->mysqli);
}
P.S。在$stmt->close()
之后不要忘记$stmt->execute()
,因为在尝试多个预准备语句时会遇到不同步问题
我也可以提供有关语法清理的一些提示,请更新您的问题:
$q = "INSERT INTO mytable (userid, title, descr) VALUES (?,?,?)";
$stmt = $this->mysql->prepare($q);
if (!is_object($stmt))
error_log("You have a problem...");
var_dump($this->mysqli);
}
/* bind parameters for markers */
$stmt->bind_param("iss", $userid, $title, $descr);
/* execute query */
$stmt->execute();
if ($stmt->errno) {
$stmt->close(); // Still need to close here
$e = new Exception;
error_log("\r\nSql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error . "\r\n" . $e->getTraceAsString());
return false;
}
/* close statement */
$stmt->close();
return $this->mysqli->insert_id;
答案 1 :(得分:0)
’
的编码不是utf8。这是唯一的问题。您的代码可能始终为utf8,但数据不是。
在child’s
之后被截断的d
是非utf8字节被输入其他优秀代码的事实。
找出生成’
的应用程序或代码,要么弄清楚它正在生成什么编码,要么弄清楚是否可以生成utf8。在前一种情况下,我们需要更改一个设置,在另一种情况下,不需要更改代码。
HEX('’')
为E282AC
。