【问题标题】:Php for loop and mysql queryphp for循环和mysql查询
【发布时间】:2014-04-08 16:09:06
【问题描述】:

我在 for 循环中使用 mysql 运行第二个数据库搜索,但我无法让它显示正确的行数:

原始搜索:

    $topicemailsql = "select se.id as id, se.users as users, se.topic as topic, se.body as body, se.postID as postID, DATE_FORMAT(se.sent, '%d.%m.%Y %H:%i:%s' ) as sent, (SELECT u.email from users u where u.users_id in (se.users)) as emails from sentEmail se LEFT OUTER JOIN topics t on (t.ID = se.theader_) where t.ID = '$topicID'";
$topicemailsqlquery = mysql_query($topicemailsql)or die(mysql_error());

$numrows = mysql_num_rows($topicemailsqlquery);

php for 循环:

    for ($i=0; $i < $numrows ; $i++){

    $sqlarray = mysql_fetch_array($topicemailsqlquery);
    $users = $sqlarray['users'];
    $sqlemail = ('select email from users where users_id in ("'.$users.'")');
    //echo $sqlemail;
    $emailsqlquery = mysql_query($sqlemail)or die(mysql_error());
    $amountofusers = mysql_num_rows($emailsqlquery);
    $sqlarrayemail = mysql_fetch_array($emailsqlquery);
    echo $amountofusers;
//echo $sqlarrayemail['email'];

    for ($a=0; $a < $amountofusers ; $a++){
        if($a == 0){
         $email = $sqlarrayemail['email'];
    }
        else if($a < $amountofusers){
        $email = $sqlarrayemail['email'].','.$sqlarrayemail['email'];
        }
        }
}

因此,基于此 $amountofusers 应该返回多于 1 行,但现在它总是只返回一行。 当我回显 $sqlemail 它应该返回 2 行,因为它看起来像这样: select email from users where users_id in ("4,82") --> 这应该返回 2 行,计数为 2,但它只返回一行。

哪里出错了?

兄弟, 托比

【问题讨论】:

  • 不回答您的问题,但您应该使用mysqliPDO,因为mysql_ 扩展已被弃用。
  • 嗨,是的,我知道这一点。只是没有时间修改所有文件。总有一天我会做到的:)

标签: php mysql


【解决方案1】:

我认为,在一个字段中存储多个值是一个非常糟糕的主意。此外,如果可以避免的话,我不会在循环中启动查询。最好一次性获取数据,让 PHP 完成剩下的工作。如果您尝试查询,即使用 PHPAdmin,您将使用

SELECT email 
FROM users 
WHERE users_id IN (4, 82)

IN 运算符需要一个逗号分隔的参数列表。你给一个单一的价值

"4,82"

这是一个巨大的差异。 MySQL 也会接受("4","82")(其他 DBMS 不那么宽容)并为您处理不需要的转换。

【讨论】:

  • 嗨 VMai,你是对的,现在它返回 2 行:从 users_id 位于 (4,82) 的用户中选择电子邮件。虽然它现在两次返回相同的电子邮件。如何获得结果以返回 id 4 和 82 的电子邮件而不重复 4 id 两次?
  • 这是它打印的内容:从 users_id 在 (4,82)john@gmail.com,john@gmail.com 的用户中选择电子邮件
  • 您只从结果集中获取一次。因此,您只会一遍又一遍地显示第一条记录。您必须在循环中获取以下记录。在您的外部 for 循环中,您将 fetch 作为循环的第一条语句。你可以对你的内部 for 循环做同样的事情。但是不要像现在这样在循环之前获取记录。
  • 好的,我不确定我是否关注你..你能举个小例子吗?
  • 嗯,我不知道你想在第二个 for 循环中做什么。如果您有多个结果,您是否需要一个以逗号分隔的电子邮件地址列表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2016-03-31
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多