PHP+MySQL新闻源方法?

PHP+MySQL新闻源方法?,php,mysql,arrays,feed,Php,Mysql,Arrays,Feed,我正在为我的应用程序开发一个新闻源,就像你在Facebook上看到的一样。所有newsfeed帖子都在同一个名为newsfeed的DB表中。我的应用程序主要围绕用户和事件发展。newsfeed表有一个newsfeed_type列int,1-14表示newsfeed_type表中的id。每个新闻提要条目还具有其他_id和其他_表+项目_id和项目_表。例如,用户向事件发布某些内容;用户是属于users表的另一个\u id,事件是属于events表的item\u id 理想情况下,我想把大约20篇按

我正在为我的应用程序开发一个新闻源,就像你在Facebook上看到的一样。所有newsfeed帖子都在同一个名为newsfeed的DB表中。我的应用程序主要围绕用户和事件发展。newsfeed表有一个newsfeed_type列int,1-14表示newsfeed_type表中的id。每个新闻提要条目还具有其他_id和其他_表+项目_id和项目_表。例如,用户向事件发布某些内容;用户是属于users表的另一个\u id,事件是属于events表的item\u id

理想情况下,我想把大约20篇按时间戳降序排序的文章装束起来,然后在我的应用程序中无限滚动加载其余的文章。PHP my script目前的工作原理是,它首先在单独的数组中收集用户正在参加的每个事件以及用户正在关注/与之交的所有用户。然后使用SQL查询逐个迭代两个数组:

事件 使用者 我编写脚本时没有意识到它要求每个事件和用户输入10个条目。让它要求一个条目也不是很理想,因为用户可以跟踪无限多的事件,并且每个条目只有一条新闻提要


您认为最好的做法是让它只获取newsfeed表中最近的20个条目,而不必迭代两个数组来获取每次获取一个newsfeed条目所需的数据?我想我可以收集一个字符串中的id和表,让SQL查询一次性抓取所有内容,而不是在循环或其他内容中,但我想我会问你们,万一有人处理了这个问题并提出了一个天才解决方案。

我找到了解决方案。我没有抓取每个用户类型并将它们存储在单独的数组中进行迭代,而是分别对这两个数组进行访问,并生成一个字符串作为sql查询,限制为25项

$sql_string = "";

foreach ($events as $event) {

    $sql_snippet = "(other_id = ". $event["id"] ." and other_table = 'events') or (item_id = ". $event["id"] ." and item_table = 'events')";

    if ($is_adding == "true") {
        $last_id = $_POST["last_id"];
        $sql_snippet .= " and id < $last_id";
    }

    if ($sql_string == "") {
        $sql_string = "(". $sql_snippet .") ";
    } else {
        $sql_string .= "or (". $sql_snippet .") ";
    }
}

foreach ($users as $user) {

    $sql_snippet = "(other_id = ". $user["id"] ." and other_table = 'users') or (item_id = ". $user["id"] ." and item_table = 'users')";

    if ($is_adding == "true") {
        $last_id = $_POST["last_id"];
        $sql_snippet .= " and id < $last_id";
    }

    if ($sql_string == "") {
        $sql_string = "(". $sql_snippet .") ";
    } else {
        $sql_string .= "or (". $sql_snippet .") ";
    }
}

$query = "select * from newsfeed where newsfeed_type = 12 or ($sql_string) order by date desc limit 25";

我想出了解决办法。我没有抓取每个用户类型并将它们存储在单独的数组中进行迭代,而是分别对这两个数组进行访问,并生成一个字符串作为sql查询,限制为25项

$sql_string = "";

foreach ($events as $event) {

    $sql_snippet = "(other_id = ". $event["id"] ." and other_table = 'events') or (item_id = ". $event["id"] ." and item_table = 'events')";

    if ($is_adding == "true") {
        $last_id = $_POST["last_id"];
        $sql_snippet .= " and id < $last_id";
    }

    if ($sql_string == "") {
        $sql_string = "(". $sql_snippet .") ";
    } else {
        $sql_string .= "or (". $sql_snippet .") ";
    }
}

foreach ($users as $user) {

    $sql_snippet = "(other_id = ". $user["id"] ." and other_table = 'users') or (item_id = ". $user["id"] ." and item_table = 'users')";

    if ($is_adding == "true") {
        $last_id = $_POST["last_id"];
        $sql_snippet .= " and id < $last_id";
    }

    if ($sql_string == "") {
        $sql_string = "(". $sql_snippet .") ";
    } else {
        $sql_string .= "or (". $sql_snippet .") ";
    }
}

$query = "select * from newsfeed where newsfeed_type = 12 or ($sql_string) order by date desc limit 25";

警告:这有一些严重问题,因为在查询中使用了$\u GET数据。尽可能使用事先准备好的陈述。在任何用户提供的数据都是用?或:名称指示符,稍后使用bind_param填充或执行,具体取决于您使用的指示符。千万不要将$\u POST、$\u GET或任何用户数据直接放在您的查询中。@tadman谢谢您的建议!警告:这有一些严重问题,因为在查询中使用了$\u GET数据。尽可能使用事先准备好的陈述。在任何用户提供的数据都是用?或:名称指示符,稍后使用bind_param填充或执行,具体取决于您使用的指示符。千万不要将$\u POST、$\u GET或任何用户数据直接放在您的查询中。@tadman谢谢您的建议!
$sql_string = "";

foreach ($events as $event) {

    $sql_snippet = "(other_id = ". $event["id"] ." and other_table = 'events') or (item_id = ". $event["id"] ." and item_table = 'events')";

    if ($is_adding == "true") {
        $last_id = $_POST["last_id"];
        $sql_snippet .= " and id < $last_id";
    }

    if ($sql_string == "") {
        $sql_string = "(". $sql_snippet .") ";
    } else {
        $sql_string .= "or (". $sql_snippet .") ";
    }
}

foreach ($users as $user) {

    $sql_snippet = "(other_id = ". $user["id"] ." and other_table = 'users') or (item_id = ". $user["id"] ." and item_table = 'users')";

    if ($is_adding == "true") {
        $last_id = $_POST["last_id"];
        $sql_snippet .= " and id < $last_id";
    }

    if ($sql_string == "") {
        $sql_string = "(". $sql_snippet .") ";
    } else {
        $sql_string .= "or (". $sql_snippet .") ";
    }
}

$query = "select * from newsfeed where newsfeed_type = 12 or ($sql_string) order by date desc limit 25";