gpt4 book ai didi

php - 如何修复mysql随机错误

转载 作者:行者123 更新时间:2023-11-29 05:17:00 25 4
gpt4 key购买 nike

我有 php + mysql 项目(超过 2 000 000 行)。请查看此 php 代码。

<?php 
for($i=0;$i<20;$i++)
{
$start = rand(1,19980);
$select_images_url_q = "SELECT * FROM photo_gen WHERE folder='$folder' LIMIT $start,2 ";
$result_select = (mysql_query($select_images_url_q));
while($row = mysql_fetch_array($result_select))
{
echo '<li class="col-lg-2 col-md-3 col-sm-3 col-xs-4" style="height:150px">
<img class="img-responsive" src="http://static.gif.plus/'.$folder.'/'.$row['code'].'_s.gif">
</li>';
}
}
?>

此代码在 $start = rand(1,19980); 位置运行非常慢,请帮助我如何使用 mysql 随机函数进行选择请求,谢谢

最佳答案

根据您的代码对 $folder 执行的操作,您可能容易受到 SQL injection 的攻击.

为了更好的安全性,考虑迁移到 PDO 或 MySQLi 和 using prepared statements .我写了一个名为 EasyDB 的库让开发人员更容易采用更好的安全实践。

从数据库中选择 N 个不同的随机元素的快速、合理和有效的方法如下:

  1. 获取符合条件的行数(即 WHERE folder = ?)。
  2. 生成一个介于 0 和该数字之间的随机数。
  3. 像您一样选择具有给定偏移量的行。
  4. 将先前生成的行的 ID 存储在一个不断增长的列表中以从结果中排除,并减少行数。

使用EasyDB的例子如下:

// Connect to the database here:
$db = \ParagonIE\EasyDB\Factory::create(
'mysql;host=localhost;dbname=something',
'username',
'putastrongpasswordhere'
);

// Maintain an array of previous record IDs in $exclude
$exclude = array();
$count = $db->single('SELECT count(id) FROM photo_gen WHERE folder = ?', $folder);

// Select _up to_ 40 values. If we have less than 40 in the folder, stop
// when we've run out of photos to load:
$max = $count < 40 ? $count : 40;

// The loop:
for ($i = 0; $i < $max; ++$i) {
// The maximum value will decrease each iteration, which makes
// sense given that we are excluding one more result each time
$r = mt_rand(0, ($count - $i - 1));

// Dynamic query
$qs = "SELECT * FROM photo_gen WHERE folder = ?";

// We add AND id NOT IN (2,6,7,19, ...) to prevent duplicates:
if ($i > 0) {
$qs .= " AND id NOT IN (" . implode(', ', $exclude) . ")";
}
$qs .= "ORDER BY id ASC LIMIT ".$r.", 1";

$row = $db->row($qs, $folder);

/**
* Now you can operate on $row here. Feel free to copy the
* contents of your while($row=...) loop in place of this comment.
*/

// Prevent duplicates
$exclude []= (int) $row['id'];
}

Gordon's answer建议使用 ORDER BY RAND()in general is a bad idea并且会使您的查询非常缓慢。此外,尽管他说您不必担心少于 40 行(大概是因为涉及的概率),但在极端情况下这失败。

关于 mt_rand() 的快速说明:它是一个有偏差且可预测的随机数生成器,只有 40 亿个可能的种子。如果你想要更好的结果,look into random_int() (仅限 PHP 7,但我正在为 PHP 5 项目开发兼容层。有关更多信息,请参阅链接的答案。)

关于php - 如何修复mysql随机错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com