【问题标题】:Get random data from database,从数据库中获取随机数据,
【发布时间】:2013-12-20 10:23:16
【问题描述】:

我有一个小问题,我有这个包含这些字段的数据库。

Table Data{
         ID
         Name,
         Text,
         Location,
         imagepath
         }

现在我想将这些值放入我的字段中,数据只是字符串。

<h3><!-- Text value here --> - <!-- Name value here --></h3>
<p> <!-- Location data here --> </p>

我还得到了这个 JS 脚本,当用户点击一个按钮时,它会生成新的字段。

$('.Next').click(function(e) {
 e.preventDefault();
 Slide.appendSlide('<!-- HTML DATA HERE   NAME AND TEXT & LOCATION VALUES -->')});

我希望 ID 是随机的,并且我不希望用户两次获得相同的数据。 我应该如何处理这个?我试过 getdata.php 但失败了。

非常感谢!节日快乐!

【问题讨论】:

  • “我不希望用户两次获得相同的数据” - 你的数据库中有无限量的数据吗?
  • 什么是“getdata.php”?
  • 不,当然不是,但是如果用户单击下一步,我不希望用户有机会再次获得相同的文本。谢谢。
  • Mtanti:尝试从数据库获取数据失败。不知道应该如何处理。
  • 我们可以看看你在 php 中做了什么吗?这只能使用 PHP 来解决。

标签: javascript php sql ajax database


【解决方案1】:

老实说,我会考虑将页面 ID 保存到 $_session['visited']。然后每次他们查看页面时将其附加到会话变量逗号分隔

$_session['visited'] .= ",".$page_id;

那么你的sql就会了。

已编辑

好的,让这段代码安全

$ph = explode(",",$_session['visited']);
foreach($ph as $check){
  if (!isnumeric($check)){
    echo "Not numeric, possible injection";
    exit;
  }
}
$parmcount=count($ph);
$inclause=implode(',',array_fill(0,$parmcount,'?'))
$sql='SELECT * FROM table WHERE ID NOT IN (%s)';
$preparesql=sprintf($sql,$inclause);
$st=$db->prepare($preparesql);
$st->execute($parms);

或者替代方法只是首先将所有查看的 id 保存为一个数组。

【讨论】:

  • 嗯,我所指的页面ID是表中行的ID。所以每次他们去一个新的 id 时,它都会被添加到 $_session['visited'] 中,然后从你的 sql 语句中排除
  • 是的,正确。在每次tile滑动结束时,将该id添加到session中,下次滑动时sql会排除它。
  • 呃,这有一个巨大的问题;您显示的示例查询基本上可以让任何人轻松运行 SQL 注入(这将由自动化工具发现!)。防御 SQL 注入的唯一/正确方法是使用参数化查询;不幸的是,没有任何诸如“数组”类型作为参数的东西,所以你不能轻易地为IN 子句提供一个 id 列表(尽管它会很好......)。目前的答案是非常危险的,应该永远被使用。
  • @Rob - 您至少可以将其添加到您的答案中,以使其更安全。请注意,我仍然更喜欢使用参数化查询,否则有人会出现并尝试“优化”代码并删除爆炸/折叠...
  • 我想你可以。我看到你这样做的方式是,将所有 id 选择到一个数组中,随机化数组,然后从该数组中获取第一个 id,取消设置,然后使用它来选择行。再一次,您必须将该数组存储为 $_SESSION var 或将其写入表中。如果您选择 $_session,请记住,如果您的服务器存在漏洞,它们可以被操纵(因此这个答案的整个 cmets)。所以使用参数化查询只是为了更加安全。
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2015-10-21
  • 2017-04-07
  • 2020-06-10
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多