0

小さな不動産会社のウェブサイトを作り始めました。関数http://www.php.net mysqlで少し遊んで、AJAX 経由でアクセスし、検索エンジンの html コンテンツを返すページを作成することができました。

アパートや家屋がすでに入力されているデータベースがあります

問題は、アパート名が「アパート」の場合、「3部屋のアパート」の場合、htmlコンテンツを返すことです。何も書き込まれません。

どこが間違っていたのかわかりません:

<?php
    $search = $_GET['selected'];

    $link = mysql_connect('localhost', 'root', '');
    mysql_select_db('houses', $link);

    function searchHouse($search, $link){
        $query = "select * from houses where name=$search limit 1";
        $result = mysql_query($query);
        $row = mysql_fetch_assoc($result);

        $query2 = "select * from houses_info where house_id=$row[id]";
        $result2 = mysql_query($query2);
        $row = mysql_fetch_assoc($result2);
        return $row;
    }

    $result = searchHouse($search, $link);

    echo $result['house_sq'];
    echo "<br>";
    echo $result['house_rooms'];
    echo "<br>";
    echo $result['house_bathrooms'];
    echo "<br>";
    echo $result['house_address'];

    ?>
4

4 に答える 4

5
  • 関数が非推奨であり、もはや維持されていないことをphp.netで「遊んだ」かどうかを知っておく必要があります。mysql_*それを知らせるページ上部の赤いボックスです。
  • そこに大きなMySQL噴出孔があり、まったく逃げていませ$string
  • あなたの問題は、次の$stringように引用符を追加していないことです:'$string'
  • PDO悪いコードと SQL インジェクションの穴を取り除くために使用する必要があります。
  • これらの 2 つの選択を単一の選択にラップできます。

    <?php
        function searchHouse($search, $link){
            $search = mysql_real_escape_string($search);
            $query = "select * from houses_info where house_id IN (select * from houses where name='".$search."' limit 1)";
            $result = mysql_query($query);
            $row = mysql_fetch_assoc($result);
            return $row;
        }
    ?>
    
  • 移行を開始できる Web サイトを既に構築しているので、このチュートリアルPDOを読んでください。コードは次のようになります。

    <?php
        $db = new PDO('mysql:host=localhost;dbname=houses;charset=UTF-8', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        $search = $_GET['selected'];
    
        function searchHouse($search){
            global $db;
    
            $query = $db->prepare("select * from houses_info where house_id IN (select * from houses where name=:search limit 1)");
            $query->execute(array(':search' => $search));
            $row = $query->fetch(PDO::FETCH_ASSOC);
            return $row;
        }
    
        $result = searchHouse($search);
    ?>
    
于 2012-09-02T22:06:56.563 に答える
0

試す:

$query = "select * from houses where name='".mysql_real_escape_string($search)."' limit 1";

SQLインジェクションを避けるために、ユーザー入力をSQLに渡す前に常にサニタイズすることを忘れないでください。

于 2012-09-02T22:06:06.847 に答える
-2

クエリでは、文字列を引用符で囲む必要があります。また、これは MySQL インジェクションに対して脆弱です。必ず $search をmysql_real_escape_stringでエスケープしてください。または、古い mysql_ 関数の代わりにMySQLiまたはPDOを使用することをお勧めします。

$query = "select * from houses where name=$search limit 1";

次のようにする必要があります。

$query = "select * from houses where name='$search' limit 1";

$search はユーザーから送信されたものであるため、絶対にエスケープする必要がありますが、悪意のあるものでなくても、単一引用符が含まれる検索クエリは壊れます。

$search = $_GET['selected'];

次のようにする必要があります。

$search = mysql_real_escape_string($_GET['selected']);

(MySQLi/PDO などのチュートリアルへのリンクが記載されたコピー ペーストを手元に持っている人はいますか?)

于 2012-09-02T22:04:23.020 に答える
-2

最初のクエリは次のようになります。

$query = "select * from house where name like $search% limit 1";

于 2012-09-02T22:07:56.557 に答える