Php 如何保护此代码不受sql注入的影响?

Php 如何保护此代码不受sql注入的影响?,php,sql,code-injection,Php,Sql,Code Injection,嘿,我制作了一个文本框,通过从数据库中获取内容自动完成输入,它现在的工作方式如下: <script type="text/javascript"> $().ready(function() { $("#food").autocomplete("get_course_list.php", { width: 260, cacheLength: 10, matchContains: false, //mustMatc

嘿,我制作了一个文本框,通过从数据库中获取内容自动完成输入,它现在的工作方式如下:

<script type="text/javascript">
$().ready(function() {
    $("#food").autocomplete("get_course_list.php", {
        width: 260,
        cacheLength: 10,
        matchContains: false,

        //mustMatch: true,
        //minChars: 0,
        //multiple: true,
        //highlight: false,
        //multipleSeparator: ",",
        selectFirst: true

    });
});
</script>
在.php文件中:

<?php
require_once "config2.php";
$q = strtolower($_GET["q"]);
if (!$q) return;

$sql = "select DISTINCT voedsel as voed from voedingswaarden where voedsel LIKE '%$q%'";
$rsd = mysql_query($sql);
while($rs = mysql_fetch_array($rsd)) {
    $cname = $rs['voed'];
    echo "$cname\n";
}
?>
但现在我读到了sql注入等内容,所以我想用mysql\u real\u escape\u string保护我的php脚本不受此影响;但我似乎无法让它发挥作用。如何在我的.php文件中实现这一点,以及这是否足以提供保护

$q = strtolower($_GET["q"]);
变成

$q = mysql_real_escape_string(strtolower($_GET["q"]));
必须建立与数据库的连接,并且必须只有一个链接,否则mysql\u查询将无法正常工作

代码不是很优雅,但它可以工作

您可能需要更改:

if (!$q) return;


我以前说过,但我认为mysql\u real\u escape\u字符串应该被分解,您应该使用它

“PDO–PHP数据对象–是一个 数据库访问层提供 访问多个数据库的统一方法 数据库。”

PDO是与数据库对话的新改进方式。PDO已经准备好了使您的网站更快/更安全的声明,因为:

准备好的语句是预编译的语句 可以执行的SQL语句 多次只发送 将数据传输到服务器。它增加了 自动生成 占位符中使用的数据是安全的 来自SQL注入攻击


但我似乎无法让它发挥作用你是如何尝试的?我尝试了类似$q=strtolower$\u GET[q];然后$q2=mysql\u real\u escape\u字符串“$q”,然后在代码的其余部分使用$q2。但是,自动完成功能将不再工作。我想您只是忘记了将变量名从$q更改为$q2。虽然没有必要使用另一个变量。一个就够了。不管怎么说,这只是缺乏关注,而不是一些知识。谢谢,这很有魅力!关于最后一部分,首先检查是否有任何字符串,然后检查是否有长度为0的字符串?为什么最后一个更好?我在努力学习:b.t.w现在这对sql注入的保护够了吗?@Javaaaa这对这段代码足够了,但它会在其他地方失败。你对其他地方的确切意思是什么?例如,如果你对mysql或连接库使用一些包装器,有多个数据库连接等@Javaaaa如果你的查询是从voedingswaarden选择voedsel,其中id=$id它将无法保护它不能使你的站点更快,尽管我几乎可以肯定它会使你的站点更快,因为查询是预编译的!
if (strlen($q) == 0) return;