2010-05-24 33 views
1

对于所有这些都很新颖,所以如果我以疯狂的方式讨论我的困惑,请告诉我!php mySQL,通过数字检索一行,将值存储为assoc.array

我在MySQL数据库中的列标题,超链接,ImageLink的

我想PHP来随机选择一个排一个表,然后就可以标题,超链接和ImageLink的另存为PHP变量。 (这样我就可以然后将它们输出到HTML)

,所以我可以有如

psuedoey代码的想法

chosenNumber = randomNumber(); 

$chosenTitle = title[chosenNumber] 
$chosenHyperlink = hyperlink[chosenNumber] 
$chosenImagelink = imagelink[chosenNumber] 

echo "<a href = $chosenTitle><img src= $chosenImagelink/> $chosenTitle </a>"; 

我想我需要在这里使用assoc命令阵列喜欢这一点,但我很困惑,因为我看遍了各种PHP的MySQL FETCH_ASSOC fetch_row等,并不能找到做哪一个我需要:(

我至今是

// database table name information 
$number = "number"; 
$title = "title"; 
$hyperlink = "hyperlink"; 
$imagelink = "imagelink"; 

// sql to select all rows of adverts 
$sql = "SELECT $number, $title, $hyperlink, $imagelink FROM $table"; 

//execute the sql 
$data = mysql_query($sql, $link); 

//count the number of rows in the table 
$bannerCount = mysql_num_rows($data); 

//generate a random number between 0 and the number of rows 
$randomNumber = mt_rand(0, $bannerCount); //do I need to do bannerCount-1 or similar here? 
$chosenNumber = $randomNumber; 

//select data from a random row 

第一时间发帖,请善待,并感谢您的任何答复或解释!

+0

请注意 - 您可以通过点击投票分数下方的复选标记将答案标记为“接受的答案”。欢迎来到堆栈溢出! – gnarf 2010-05-24 23:30:50

回答

1

使用ORDER BY RAND() LIMIT 1是一个体面的方式来从一个小表中获得单行。使用此方法的缺点是必须为表中的每一行计算RAND(),然后必须对此非索引值执行排序以计算所需的行。随着桌子的增长,ORDER BY RAND()变得非常低效。更好的方式来处理这个问题是首先获得在表中的行数的计数,计算得到随机行号阅读,并使用LIMIT [offest,] count选项上您的SQL查询:

$sql = "SELECT COUNT(*) as rows FROM $table" 
$res = mysql_query($sql); 
if (!$row = mysql_fetch_assoc($res)) { 
    die('Error Checking Rows: '.mysql_error()); 
} 
$rows = $row['rows']; 

// now that we know how many rows we have, lets choose a random one: 
$rownum = mt_rand(0, $rows-1); 
$sql = "SELECT number, title, hyperlink, imagelink FROM $table LIMIT $rownum,1"; 
$res = mysql_query($sql); 
$row = mysql_fetch_assoc($res); 

// $row['number'] $row['title'] etc should be your "chosen" row 

这第一个查询请求SQL Server有多少行可用,然后LIMIT s实际查询的结果集只返回1行,从我们选择的随机数行开始。

+0

根据这个:http://stackoverflow.com/questions/684989/one-complex-query-vs-multiple-simple-queries似乎多个查询不会是解决方案,特别是在PHP中,你只能在MySQL上执行在一次通话中查询。这是不是有原因? – 2010-05-24 23:33:28

+0

比MySQL更快速地生成潜在的数千个随机数然后将它们编入索引 - 是的。 – gnarf 2010-05-24 23:35:38

+0

好的,那并不意味着它是最终的解决方案。两者都很好。这取决于你的数据库的大小。你在哪里画线? 1000条记录? 100000?等等? – 2010-05-24 23:37:18

0

如果你想记录随机,你可以简单地修改你的SQL查询,每次将获得的记录随机排序,只需添加order by rand()到您的查询,limit条款,如果你想要得到的只是一个随机记录:

$sql = "SELECT $number, $title, $hyperlink, $imagelink FROM $table 
order by rand() limit 1"; 

一旦你做到这一点,你需要使用像mysql_fetch_arraymysql_fetch_object函数来获得实际的行:

$data = mysql_query($sql, $link); 

while ($row = mysql_fetch_array($data)) 
{ 
    echo $row['title'] . '<br />'; 
    echo $row['hyperlink'] . '<br />'; 
    echo $row['imagelink'] . '<br />'; 
} 

有了:

$row = mysql_fetch_array($data) 

你必须提供$row阵列在您的处置在你的页面的任何地方像呼应值:

echo $row['title']; 
    echo $row['hyperlink']; 
    echo $row['imagelink']; 
+1

'ORDER BY rand()'在较大的桌子上可能会相当昂贵 – gnarf 2010-05-24 21:45:09

+2

@gnarf - 考虑到她只是抓住每一行,我认为RAND会起作用。 – 2010-05-24 21:46:49

+0

@Kerry - 会的,是的。然而,考虑到OP正在寻求更好的方法来做到这一点,为什么会提出一些严重的问题呢?我还注意到你(以及两位赞成你评论的人)并没有满意答案,所以不能推荐:) – gnarf 2010-05-24 22:02:05

0

我认为,如果你使用“限制”条款,这将是非常高效:

SELECT number, title, hyperlink, imagelink FROM $table order by rand() limit 1 

为什么要为表名和字段名设置变量?

+0

我为字段名称和表名设置了变量,因为我正在为其他人提供此信息,但是他们还没有向我提供数据库中列名称的详细信息,所以我必须创建一个“示例”我自己的一个显示代码工作。我不想为了使它工作而更改所有的代码,只要将实时数据提供给顶部的所有信息即可。 – princessmarisa 2010-05-24 22:41:42