0

根据我收到的错误消息,我的 SQL 语法有问题,但无法弄清楚。我正在尝试创建一个系统,我可以在其中使用 AJAX、PHP 和 SQL 搜索项目名称以查找匹配项。与搜索词的每个匹配项都以超链接的形式显示在屏幕上,单击该超链接后,我打算将我带到另一个页面,然后该页面将显示与搜索词相关的任何内容。

我已将其设置为搜索数据库并显示超链接,但是当我单击超链接以加载相关匹配项时,我收到错误消息“您的 SQL 语法有错误;请查看与您的 MySQL 相对应的手册服务器版本,以便在第 1 行的 'Home From Home''' 附近使用正确的语法

现在在代码中,您不会在任何地方找到 Home From Home 引用,因为那是“search_value”选择的搜索词。我认为我的问题与我的查询有关,但我不是 100% 确定。我将发布下面所有 3 个页面的代码,以便您查看所有页面如何链接在一起等。

我哪里错了?

CPanel.php

<html>
    <head>
    <script>
        function showHint(str) {
            if (str.length==0) { 
                document.getElementById("results_box").innerHTML="Matching Project Names: <hr/>";
                return;
            }

            if (window.XMLHttpRequest) {
                // code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            } else {
                // code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }

            xmlhttp.onreadystatechange=function() {
                if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                     document.getElementById("results_box").innerHTML=xmlhttp.responseText;
                 }
            }

            xmlhttp.open("GET","CPanel_Inc.php?search_value="+str,true);
            xmlhttp.send();
        }
    </script>
    </head>

    <body>
        <p><b>Project Search:</b></p>
         <form> 
            Project Name: <input type="text" onKeyUp="showHint(this.value)" size="20" />
         </form>
         <div id="results_box">
            Matching Project Names: <hr/>
         </div> 
    </body>
</html>

CPanel_Inc.php

<?php
    $connect = mysqli_connect("localhost", "root", "", "creative wolf");
    if (mysqli_connect_errno()) {
        printf("Connect Failed", mysqli_connect_error());
        exit();
    } else { 

        // Get the search_value parameter from URL
        $search_value = $_GET["search_value"];
        $content = "";

        // Search database for comparable values provided that search_value has some value
        if (strlen($search_value) > 0) {        

            // Sets up query return results
            $qry = "SELECT ProjectName FROM projects WHERE ProjectName LIKE '".mysql_real_escape_string($search_value)."%'";
            $res = mysqli_query($connect, $qry) or die(mysqli_error($connect));


            if (mysqli_num_rows($res) < 1){
                printf("Matching Project Names: <hr/> Could not retrieve records matching your search critera", mysqli_error($connect));
            } else {    
                $content .= "Matching Project Names: <hr/>";    
                while ($data = mysqli_fetch_array($res)) {
                    $content .= "<li><a href=\"search.php?search_value='". $data['ProjectName']."'\"> " . $data['ProjectName']. "</a></li>";
                }   
                echo "$content";
            }   
        }

        mysqli_free_result($res);
        mysqli_close($connect);
    }
?>

搜索.php

<?php
    $connect = mysqli_connect("localhost", "root", "", "creative wolf");
    if (mysqli_connect_errno()) {
        printf("Connect Failed", mysqli_connect_error());
        exit();
    } else { 

        // Get the search_value parameter from URL
        $content = "";

        // Set up query
        $get_data_qry = "SELECT * FROM content WHERE ProjectName = '".$_GET["search_value"]."'";
        $get_data_res = mysqli_query($connect, $get_data_qry) or die(mysqli_error($connect));

        while ($clientData = mysqli_fetch_array($get_data_res)) {
            $content .= $clientdata['ProjectName'];
            $content .= $clientdata['RequestedBy'];
            $content .= $clientdata['FileLocation'];
            $content .= $clientdata['Description'];
            $content .= "<br />";
        }

        mysqli_free_result($res);
        mysqli_close($connect);
    }
?>
4

5 回答 5

1

你应该打印什么$get_data_qry

如果你.$_GET["search_value"].有一个单引号,你的查询将如下所示:

SELECT * FROM content WHERE ProjectName = 'anything with a ' should be escaped ';

这将导致语法错误。

所以你必须像在 CPanel_Inc.Php 中那样做

"SELECT * FROM content WHERE ProjectName = '".mysql_real_escape_string($_GET["search_value"])."'"
于 2012-10-23T17:08:51.227 回答
0

如果是在您单击以下生成的链接之后:

$content .= "<li><a href=\"search.php?search_value='". $data['ProjectName']."'\"> " . $data['ProjectName']. "</a></li>";

我可以看到一个问题。您正在向 GET 参数添加单引号,search_value然后将其传递到查询中:

"SELECT * FROM content WHERE ProjectName = '".$_GET["search_value"]."'"

最终结果是:

SELECT * FROM content WHERE ProjectName = ''GET Value''

那些额外的单引号可能是错误的。

当您遇到这样的查询问题时,回显最终查询字符串通常有利于调试目的。

对于执行 AJAX 请求,我建议不要手动处理它(您似乎正在这样做),而是使用 jQuery 之类的东西。并且永远不会将用户输入连接到 SQL 语句中。曾经。这为简单的SQL 注入方法打开了大门,这些方法使您的数据库处于开放状态,容易被渗透或损坏。

于 2012-10-23T17:14:23.513 回答
0

我知道这是一个旧线程,但我想在 PHP 中的准备好的语句上添加我的 2cents。请参阅此处http://software-security.sans.org/developer-how-to/fix-sql-injection-in-php-using-prepared-statements以及如何防止 PHP 中的 SQL 注入? 关于准备好的语句的 PHP 手册:http: //php.net/manual/en/mysqli-stmt.prepare.php

使用准备好的语句作为 pdo/mysql 数据库操作的默认值将使您的查询更加结构化和安全。

还可以尝试将您的数据库配置(用户、密码、主机)单独存储在一个不可公开访问的文件中(请参阅如何在 PHP 中保护数据库密码?)。

于 2014-07-18T13:32:55.357 回答
0

在 search.php 文件中试试这个:

"SELECT * FROM content WHERE ProjectName = '".mysql_real_escape_string($_GET["search_value"])."'" 

还要检查以确保您没有将任何额外的引号或双引号附加到 $_GET["search_value"]。通过 mysql 错误消息,似乎可能有一些额外的引号:

“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在第 1 行的 'Home From Home ** ' ' ** ' 附近使用的正确语法”

于 2012-10-23T17:08:40.160 回答
-1

阅读了所有留下的评论和提供的帮助后,我找到了解决方案:)。

正如你们中的一些人所说,这确实是我的报价的问题。正如 Digitlworld 建议的那样,我回显了查询的输出,发现传递给获取值的值是问题所在。

弄清楚这一点后,我已经更正了 CPanel_Inc.php 中的违规代码行,如下所示

$content .= "<li><a href=\"search.php?search_value=". $data['ProjectName']."\"> " . $data['ProjectName']. "</a></li>";

我还接受了人们对 SQL 注入的看法,并将我的查询调整为如下所示

$get_data_qry = "SELECT * FROM content WHERE ProjectName = '".mysql_real_escape_string($_GET["search_value"])."'";

有没有什么好的,但简单的教程或指南可以帮助我对抗 SQL 注入,我对这种项目相当陌生,所以任何帮助只会帮助提高我的能力。

非常感谢大家的帮助,你们所有的投入的结合帮助我找到了解决方案。

于 2012-10-23T17:55:42.663 回答