如果名称中有撇号,如何在表中搜索名称?
如果我在搜索框中插入带有撇号的名称,例如Ender's Game
,它会给出错误。
我已经尝试了堆栈溢出上提供的解决方案,但我无法解决这个问题。
这是我的代码:
$string1 = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = '$string1'";
$q = mysqli_query($conn, $quer);
如果$_GET['name']
中有撇号,则会显示错误。
我该如何解决这个问题?
这种形式的代码容易受到SQL注入的影响。 改用 mysqli::p repare :
$string1 = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = ?";
$stmt = $conn->prepare($quer);
$stmt->bind_param('s', $string1);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
$stmt->close();
var_export($result);
如果您正在调整遗留的不安全代码,则使用 mysqli_real_escape_string 可能会更快。 这应该保留为最后的手段,但如果您需要它,它就在那里,它比正则表达式更好。
你可以期望一遍又一遍地从知识渊博的StackOverflow志愿者那里听到的最佳实践是使用准备好的语句来确保查询的安全性和可靠性。
对于您的情况,我推荐以下代码片段,它不仅可以安全地执行您的SELECT
查询,还可以在整个过程中提供信息丰富的诊断/调试检查点,并允许您处理结果集 - 由多维关联数组表示。
$_GET['name'] = "vinay's name";
$string1 = $_GET['name'];
if (!$conn = new mysqli("host", "user", "pass", "db")) {
echo "Database Connection Error: " , $conn->connect_error; // do not show this to public
} elseif (!$stmt = $conn->prepare("SELECT * FROM info WHERE name = ?")) {
echo "Prepare Syntax Error: " , $conn->error; // do not show this to public
} elseif (!$stmt->bind_param("s", $string1) || !$stmt->execute()) {
echo "Statement Error: " , $stmt->error; // do not show this to public
}else{
$result = $stmt->get_result();
while($row = $result->fetch_array(MYSQLI_ASSOC)){
var_export($row); // do what you like here
}
}
重要的是要注意,如果info
表包含多列,则使用$stmt->bind_result($result)
(如 Zenexer 的答案(将不起作用(生成$result = NULL
((我假设它将适用于一列,但我没有测试(;并且由于SELECT *
中选择的列数与指定变量的数量之间的不平衡,它将生成警告。
警告:mysqli_stmt::bind_result((:绑定变量的数量与预准备语句中的字段数不匹配
如果要享受显式绑定结果变量的好处,则应在SELECT
子句中指定所需的列,如下所示:
if (!$conn = new mysqli("host", "user", "pass", "db")) {
echo "Database Connection Error: " , $conn->connect_error; // do not show this to public
} elseif (!$stmt = $conn->prepare("SELECT id FROM info WHERE name = ?")) {
echo "Prepare Syntax Error: " , $conn->error; // do not show this to public
} else {
if (!$stmt->bind_param("s", $string1) || !$stmt->execute() || !$stmt->bind_result($id)) {
echo "Statement Error: " , $stmt->error; // do not show this to public
} else {
while ($stmt->fetch()) {
echo "<div>$id</div>";
}
}
$stmt->close();
}