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 注入漏洞。
  • 您可以将这两个选择包装成一个选择:

    <?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;
        }
    ?>
    
  • 由于您已经在构建您可以开始迁移到的网站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 注入的影响,请确保使用mysql_real_escape_string转义 $search 。或者更好的是使用MySQLiPDO代替旧的 mysql_ 函数。

$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 回答