0

表示されるエラー メッセージによると、SQL 構文に問題がありますが、理解できません。AJAX、PHP、および SQL を使用して一致するプロジェクト名を検索できるシステムを作成しようとしています。検索用語に一致するたびに、ハイパーリンクとして画面に表示されます。クリックすると、検索用語に関連するコンテンツを表示する別のページに移動します。

データベースを検索してハイパーリンクを表示するように設定しましたが、ハイパーリンクをクリックして関連する一致をロードすると、「SQL 構文にエラーがあります。MySQL に対応するマニュアルを確認してください」というエラー メッセージが表示されます。 1 行目の 'Home From Home''' の近くで使用する正しい構文のサーバー バージョン"

コード内では、「search_value」が取得する検索語であるため、Home From Home はどこにも参照されていません。私の問題はクエリにあると思いますが、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);
    }
?>

Search.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

これを search.php ファイルで試してください:

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

また、$_GET["search_value"] に余分な引用符や二重引用符を追加していないことを確認してください。mysql エラー メッセージによると、余分な引用符がいくつかあるようです。

「SQL 構文にエラーがあります。1 行目の 'Home From Home ** ' ' ** ' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください」

于 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 に答える