【问题标题】:How to randomly retrieve images from my mysql database?如何从我的 mysql 数据库中随机检索图像?
【发布时间】:2011-08-05 08:23:57
【问题描述】:

好的,我已经制作了一个 php 文件来输出图像,这是输出页面的示例代码:

mysql_connect (" "," "," ") 或 die(mysql_error()); mysql_select_db(" ") or die(mysql_error());

$query = mysql_query("SELECT * FROM store"); 
$number=mysql_num_rows($query); 

$result = mysql_query ("SELECT * FROM store ORDER BY RAND() LIMIT $number");

while ($row = mysql_fetch_assoc($result))     
{       
    echo '<img src=get.php?id=$row["id"]>';
}

img 标签所指的 get.php 有这样的代码:

mysql_connect (" "," "," ") 或 die(mysql_error()); mysql_select_db(" ") or die(mysql_error());

 $id = addslashes ($_REQUEST['id']);


$query = mysql_query("SELECT * FROM store WHERE id= $id ");
$row = mysql_fetch_array($query);
$content = $row['image'];

header('Content-type: image/jpg');
 echo $content;

我得到的只是输出页面上的一系列撕裂的页面图标。看到我仍然在学习 php,我可能会犯一个非常简单的错误。提前致谢。

【问题讨论】:

    标签: php image random


    【解决方案1】:

    清理:

    $result = mysql_query("SELECT * FROM store ORDER BY RAND()");
    
    while($row = mysql_fetch_assoc($result)){       
        echo '<img src="get.php?id='.$row[id].'" />';
    }
    

    您也可以echo mysql_error();查看您的mysql语句是否有错误。

    您还应该使用 mysql_real_escape_string() 而不是 addlashes()

    或者考虑PDO 以获得更安全的解决方案。

    要调试,请转到 get.php?id=1。如果您看到图像 get.php 正在工作,而主文件却没有。

    你确定get.php连接到数据库和主文件了吗?

    【讨论】:

    • 当我输入 get.php?id=1 时,它确实显示了图像,但我仍然不明白我对主文件做错了什么。
    • mysql_real_escape_string 和 addlashes 在这里都没有帮助。尽管准备好的语句会
    • 谢谢,你能告诉我为什么对代码所做的这些更改有效吗?
    • 把你的报价放在正确的地方是非常重要的(比较我的img标签和你的)。 Wesley 还提到,无论如何选择每一行时都不需要使用 LIMIT。
    【解决方案2】:

    这个脚本中有一些不合逻辑的东西。

    1. 您从存储中选择所有内容(* 等于所有字段)。这是非常非常昂贵的。如果你想使用它,你应该使用 SELECT COUNT(id) FROM store。

    2. 您使用计数来限制。但限制将始终与行数相同。哪个使 LIMIT 无关紧要?

    3. 您不应该使用 addlashes 来转义您的值。请改用 mysql_real_escape_string。 Check it out here

    我不确定您的数据库中有哪些值,也许您可​​以发布一些?也许您需要执行带斜杠,因为您可能在数据库中保存带有斜杠的值?

    【讨论】:

    • 表格中有六列:"id","name","image","com","desc",和"url"。 “id”是 int 类型,“name”是 varchar(50),“image”是 BLOB 类型。 “com”、“desc”、“url”都是文本类型。
    • mysql_real_escape_string 只会在此处添加斜杠
    • 选择每个字段并不昂贵。但是,选择所有行是。
    • 我不得不不同意这一点,也许不是在 MySQL 本身的性能方面,但在流量方面,这可能是高流量网站或大型进程/导入或更新脚本的杀手.是的,当然我也指出选择所有行:)。感谢您的评论!
    【解决方案3】:

    我得到的只是输出页面上的一系列撕裂的页面图标。

    事实上,您对您的网站创建了一种“拒绝服务”攻击,使其运行数十个 PHP 脚本并在每个页面请求中打开数十个 sql 连接。难怪你的服务器被这样的洪水超载并且没有显示任何图片。

    还要注意您的代码遭受了 SQL 注入的影响。
    要么将添加斜杠更改为intval(),要么在查询中在 $id 周围添加引号(否则转义将毫无意义)

    【讨论】:

    • 你能解释一下SQL注入和“转义”吗? intval() 能治愈 SQL 注入吗?
    • intval() 通常与注入无关。没有cure_all_injections_for_me() 函数。但在这种特殊情况下,它会有所帮助
    猜你喜欢
    • 2013-01-08
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2014-02-19
    • 2015-07-06
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多