如果搜索词中有撇号,如何查询我的表?

oxf4rvwz  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(373)

如果名称中有撇号,如何在表中搜索名称?
如果我在名字里加个撇号 Ender's Game 在我的搜索框中,它给出了一个错误。
我已经尝试了stackoverflow上提供的解决方案,但无法解决此问题。
这是我的密码:

$string1  = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = '$string1'";
$q = mysqli_query($conn, $quer);

如果有撇号 $_GET['name'] ,将显示一个错误。
我怎样才能解决这个问题?

5rgfhyps

5rgfhyps1#

最好的实践是使用预先准备好的语句来确保查询的安全性和可靠性。
对于您的情况,我推荐以下代码片段,它不仅安全地执行 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
    }
}

重要的是要注意 $stmt->bind_result($result) (如zenexer的回答)不会起作用(生成 $result = NULL )如果 info 表包含多个列(我假设它将与一个列一起工作,但我没有测试);它将生成一个警告,因为从 SELECT * 以及指定变量的数量。
警告:mysqli_stmt::bind_result():bind变量的数目与prepared语句中的字段数目不匹配
如果您想享受显式绑定结果变量的好处,应该在 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();
}
z3yyvxxp

z3yyvxxp2#

这种形式的代码容易受到sql注入的攻击。改用mysqli::prepare:

$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\u real\u escape\u string可能会更快。这应该是保留作为最后手段,但它在那里,如果你需要它,它比正则表达式更好。

相关问题