0

我在 mysql 表中有大量报价,我想每 10 秒在我的网页上显示一个随机报价。我用谷歌搜索了这个问题,但我确实找到了如何从数据库中选择一个随机记录作为第 1 部分以及如何每 10 秒更改一次页面上的文本作为第 2 部分,因此当我将两个部分链接在一起时,我会显示随机报价页面,但它每 10 秒重复一次。所以请帮忙。

<?PHP

$dbh = new PDO('mysql:dbname='.$db_name.';host='.$db_host.';charset=utf8', $db_username, $db_password );

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT message FROM `fb_messages` ORDER BY RAND( ) LIMIT 1";

try {

    $msg = $dbh->prepare($sql);
    $msg->execute();
    $msgtxt = $msg->fetchAll(PDO::FETCH_COLUMN, 0);
    $txt = json_encode($msgtxt);
    }

    catch(PDOException $e)
{
    echo $e->getMessage();
    die();
}
?>
<html>
<head>
<title>Rotating Text</title>
<script type="text/javascript">
var rotatingTextElement;
var rotatingText = new Array();
var ctr = 0;

function initRotateText() {
rotatingTextElement = document.getElementById("textToChange");
rotatingText[0] = rotatingTextElement.innerHTML; // store the content that's already on the page
rotatingText[1] = "Some Text";
setInterval(rotateText, 5000);
}
function rotateText() {
ctr++;
if(ctr >= rotatingText.length) {
ctr = 0;
}
rotatingTextElement.innerHTML = rotatingText[ctr];
}
window.onload = initRotateText;
</script>
</head>
<body>
<span id="textToChange"><?php echo $txt; ?></span>
</body>
</html>
4

1 回答 1

0

要使实际解决方案起作用,您必须每 10 秒使用ajax调用来加载新的随机数。

理论如下:

  • 您使用给定的代码作为第一个随机显示
  • 将 setInterval 设置为每十秒调用一次 rotateText(就像现在一样)
  • 但是您更改了 rotateText 的主体以向您的服务器发出 ajax 调用,并加载下一个随机引用

函数的主体可能如下(实现时要小心,我假设存在jQuery 库,并且 url 必须匹配,稍后详述):

function rotateText() {
  $.ajax({
    url: 'your/url/for/the/generator/php',
    dataType: 'text',
    success: function (response) {
      rotatingTextElement.innerHTML = response;
    }
  });
}

为此,您必须创建第二个 php 文件,它什么都不做,只是加载一个随机引用并将其回显到输出,并将 ajax 调用中的 url 指向该 php.ini 文件。

从您的代码中复制:

<?php
$dbh = new PDO('mysql:dbname=' . $db_name . ';host=' . $db_host . ';charset=utf8', $db_username, $db_password);

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT message FROM `fb_messages` ORDER BY RAND() LIMIT 1";

try {
  $msg = $dbh->prepare($sql);
  $msg->execute();
  $msgtxt = $msg->fetchAll(PDO::FETCH_COLUMN, 0);
  $txt = json_encode($msgtxt);
} catch(PDOException $e) {
  echo $e->getMessage();
  die();
}
header('Content-Type: text/plain');
echo $txt;

这没有其他任何作用,只是加载下一个随机引用,并将其显示为输出中的纯文本行。

使用您定义的数组,您可以执行一些操作,例如用 10-15 个元素预填充数组,然后在它们之间旋转。(这将是真正的旋转,因为上面提到的 ajax 解决方案每十秒给出一个新的随机报价,没有特定的顺序)

于 2013-04-03T09:02:06.713 回答