我正在使用PHP传递这样的查询:
"UPDATE `prove750_mrdias`.`stringsMrDias`
SET `conteudo` = '$conteudo'
WHERE `stringsMrDias`.`ID` = $id;"
当我echo $conteudo
时,我按预期得到Sobre\nmim
。
但在查询之后,我查看数据库,存储的值是格式化字符串:
'自我
MIM'
在将数据解析回我的应用程序时,会导致各种问题。
如果我转到phpMyAdmin并手动传递$conteudo
的值,它会保持预期的行为,只有在查询替换时才会调用它而不调用它。
有什么想法吗?
答案 0 :(得分:3)
我怀疑这是一个插值问题。你可以使用准备好的陈述一举两得。使用预处理语句
您的数据不会被破坏或需要由您手动处理,
您的申请不会受到SQL injection的安全问题的影响。
这可能如下所示:
$sql = "UPDATE `prove750_mrdias`.`stringsMrDias` SET `conteudo` = ? WHERE `stringsMrDias`.`ID` = ?";
$preparedStatement = $pdo_handle->prepare( $sql );
$preparedStatement->execute([$conteudo, $id]);
也就是说,首先告诉数据库您要执行的查询的表单,然后 - 在单独的调用中 - 将参数发送给该查询。
答案 1 :(得分:0)
答案 2 :(得分:0)
准备好的陈述是正确的方向。
在查看mysqli文档后,我最终得到了这样的代码:
`$sql = "UPDATE `prove750_mrdias`.`stringsMrDias` SET `conteudo` = (?) WHERE `stringsMrDias`.`ID` = (?)";
if (!($stmt = $con->prepare($sql))) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->bind_param('ss', $conteudo,$id)) {
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}`
必须使用bind_param()
作为execute()
,不接受任何参数。