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

Php 如果搜索词中有撇号,如何查询我的表?,php,mysql,escaping,user-input,Php,Mysql,Escaping,User Input,如果名称中有撇号,如何在表中搜索名称 如果我在搜索框中插入带有撇号的名称,如Ender's Game,则会给出一个错误 我已经尝试了stackoverflow上提供的解决方案,但无法解决此问题 这是我的密码: $string1 = $_GET['name']; $quer = "SELECT * FROM info WHERE name = '$string1'"; $q = mysqli_query($conn, $quer); 如果$\u GET['name']中有撇号,则会显示错误 如

如果名称中有撇号,如何在表中搜索名称

如果我在搜索框中插入带有撇号的名称,如
Ender's Game
,则会给出一个错误

我已经尝试了stackoverflow上提供的解决方案,但无法解决此问题

这是我的密码:

$string1  = $_GET['name'];
$quer = "SELECT * FROM info WHERE name = '$string1'";
$q = mysqli_query($conn, $quer);
如果
$\u GET['name']
中有撇号,则会显示错误


如何解决此问题?

这种形式的代码容易受到攻击。改用:

$string1=$\u GET['name'];
$quer=“从信息中选择*,其中名称=?”;
$stmt=$conn->prepare($query);
$stmt->bind_参数('s',$string1);
$stmt->execute();
$stmt->bind_result($result);
$stmt->fetch();
$stmt->close();
var_导出(结果);

如果您正在修改遗留的、不安全的代码,那么使用它可能会更快。这应该作为最后的手段保留下来,但如果您需要它,它就在那里,而且它比正则表达式更好。

您可以从知识渊博的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():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();
}
if(!$conn=newmysqli(“主机”、“用户”、“通过”、“数据库”)){
echo“数据库连接错误:”,$conn->connect_Error;//不向公众显示
}elseif(!$stmt=$conn->prepare(“从名称=?”的信息中选择id”){
echo“Prepare Syntax Error:,$conn->Error;//不向公众显示此内容
}否则{
如果(!$stmt->bind_参数(“s”,$string1)| |!$stmt->execute()| |!$stmt->bind_结果($id)){
echo“Statement Error:,$stmt->Error;//不向公众显示
}否则{
而($stmt->fetch()){
回显“$id”;
}
}
$stmt->close();
}

永远不要将用户数据直接放入查询中。这使您容易受到SQL注入攻击。请参阅。我正在使用preg_replace('/[^a-zA-Z0-9\-\:'.\]/',''$string1);避免特殊字符。@vinay不要这样做。引用从来都不是完美的,有人会找到绕过它的方法。让司机帮你处理,还是不安全吗?我已经开发了网站,我很难用prep语句替换整个代码。你是对的,我会尝试用prep语句替换代码。谢谢..好的,我现在会添加mysqli\u real\u escape\u字符串,但我会尝试用prep语句替换我的代码。谢谢你的帮助谢谢你的回答。您的代码帮助我理解编写代码的最佳方式。