如何使用mysqli准备好的语句安全地更新和检索字符串?

时间:2018-10-30 05:06:57

标签: php sql mysqli

我正在使用一个表单来更新网站上显示的数据。这只是文本信息,但是将包含撇号和引号。

我认为使用带有针对Update SQL语句和Select语句的参数的预处理语句将分别自动转义和取消转义特殊字符。这似乎没有发生。由于语句由于撇号而格式不正确,因此准备好的语句仍然混淆了撇号。

我在更新之前在字符串上使用mysqli_real_escape_string来解决此问题,但是当我使用另一个准备好的语句(使用一个参数选择)获取字符串时,转义的撇号会显示在html页的文本中(例如:/'hello /'而不是'hello')。

所以我用反斜杠。这行得通,但我认为mysqli准备好的语句为您做到了。有什么想法吗?

更新:

$mysqli = new mysqli($servername, $username, $password, $dbname);   
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
} 
$sql = "UPDATE table SET mycol= ? WHERE myparam= ?";
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('ss', $mycol, $myparam);
if (!$stmt->execute()) { 
       echo "Error updating record: " . $stmt->error;                                  
}

获取:

$mysqli = new mysqli($servername, $username, $password, $dbname);                           

if($mysqli->connect_error)
{
    die("$mysqli->connect_errno: $mysqli->connect_error");
}

$sql= "Select * From table Where myvar= ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $myparam);
$stmt->execute();
$stmt_result = $stmt->get_result();

if ($stmt_result->num_rows>0) {
    $row = $stmt_result->fetch_assoc();    }

2 个答案:

答案 0 :(得分:0)

使用“ mysqli_real_escape_string”函数来避免安全风险。

答案 1 :(得分:0)

抱歉打扰人!

准备好的语句按预期工作,我不需要使用mysqli_real_escape_string。

此后我看到的问题是我对文本进行了两次转义。它是固定的。

感谢所有回答!