当存储数据时,MySQL不需要自动替换换行符

时间:2018-04-02 12:19:53

标签: php mysql mysqli

我正在使用PHP传递这样的查询:

"UPDATE `prove750_mrdias`.`stringsMrDias` 
SET `conteudo` = '$conteudo' 
WHERE `stringsMrDias`.`ID` = $id;"

当我echo $conteudo时,我按预期得到Sobre\nmim

但在查询之后,我查看数据库,存储的值是格式化字符串:

'自我

MIM'

在将数据解析回我的应用程序时,会导致各种问题。

如果我转到phpMyAdmin并手动传递$conteudo的值,它会保持预期的行为,只有在查询替换时才会调用它而不调用它。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我怀疑这是一个插值问题。你可以使用准备好的陈述一举两得。使用预处理语句

  1. 您的数据不会被破坏或需要由您手动处理,

  2. 您的申请不会受到SQL injection的安全问题的影响。

  3. 这可能如下所示:

    $sql = "UPDATE `prove750_mrdias`.`stringsMrDias` SET `conteudo` = ? WHERE `stringsMrDias`.`ID` = ?";
    $preparedStatement = $pdo_handle->prepare( $sql );
    $preparedStatement->execute([$conteudo, $id]);
    

    也就是说,首先告诉数据库您要执行的查询的表单,然后 - 在单独的调用中 - 将参数发送给该查询。

答案 1 :(得分:0)

试试http://php.net/manual/en/function.nl2br.php 例如,

$conteudo = nl2br($conteudo);

然后存入数据库。

答案 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(),不接受任何参数。