【问题标题】:PHP/MySQL Query/LoopPHP/MySQL 查询/循环
【发布时间】:2015-02-15 19:44:24
【问题描述】:

我有一个具有以下结构的数据库:

<table border="2">
      <tbody>
        <tr>
          <td>ID</td>
          <td>numbering</td>
          <td>country</td>
          <td>operator</td>
          <td>rate</td>
        </tr>
        <tr>
          <td>1</td>
          <td>12345</td>
          <td>country1</td>
          <td>operator1</td>
          <td> </td>
        </tr>
        <tr>
          <td>2</td>
          <td>12345</td>
          <td>country1</td>
          <td>operator1</td>
          <td> </td>
        </tr>
        <tr>
          <td>3</td>
          <td>12345</td>
          <td>country1</td>
          <td>operator1</td>
          <td> </td>
        </tr>
        <tr>
          <td>4</td>
          <td>12345</td>
          <td>country1</td>
          <td>operator2</td>
          <td> </td>
        </tr>
        <tr>
          <td>5</td>
          <td>12345</td>
          <td>country1</td>
          <td>operator2</td>
          <td> </td>
        </tr>
        <tr>
          <td>6</td>
          <td>12345</td>
          <td>country1</td>
          <td>operator2</td>
          <td> </td>
        </tr>
      </tbody>
    </table>

我首先根据用户选择的国家查询运营商,并显示它们,但是我还想为每个运营商显示相应的编号集。这是我目前实现的代码:

<?php
    $operator_rates= $wpdb->get_results("SELECT DISTINCT operator, rate FROM database WHERE country='$_GET[country]'");
            foreach ( $operator_rates as $operator_rate ) {
                $numbering = $wpdb->get_results("SELECT numbering FROM database");
                echo '
                <strong>'.$operator_rate->operator.'</strong><br/>'.$numbering;
            } ?>

我得到的结果如下:

运算符 1
数组 运算符 2
数组 运算符 3
数组

我期望的结果是每个运算符都在其下方,每个运算符的编号集正好在其下方:

操作员 1
12345、12345、12345、12345

操作员 2
12345、12345、12345、12345

操作员 3
12345、12345、12345、12345

【问题讨论】:

  • 你的实际输出是?
  • 对不起,由于某种原因,图片没有上传,我做了一些复制输出的文本
  • 警告:通过将$_GET 数据直接放入查询中,您创建了一个危险的SQL injection bug永远不要这样做。相反,请使用 WordPress prepared statements feature 正确转义所有数据参数。
  • 我认为在您的第二个查询中,您需要指定 where = 运算符。也就是说,如果第二个查询的结果确实多于一行,那么您也需要循环该行
  • @MarcoMura 它肯定会产生不止一个结果,因为有多个运算符附加了不同的编号

标签: php mysql arrays loops


【解决方案1】:

改变这一行

$numbering = $wpdb->get_results("SELECT numbering FROM database", ARRAY_A);

并改变这一行

<strong>'.$operator_rate->operator.'</strong><br/>'.$numbering;

有了这个

<strong>'.$operator_rate->operator.'</strong><br/>'.implode(',', $numbering['numbering']);

【讨论】:

  • 这只是拾取附加到一个运算符的第一个数字,并与每个运算符复制相同的值。我想显示附加到一个运算符的一组数字,然后显示附加到第二个运算符的第二组数字
  • 我已经添加了答案试试下面的
  • 实施第二个选项给了我以下错误:可捕获的致命错误:stdClass 类的对象无法转换为 //directory on line 87 中的字符串
  • 我已经重新编辑了答案,现在试试,应该可以正常工作
  • 这是破坏代码,当我实现您的解决方案时,注意加载只是白页
【解决方案2】:

$numbering 是一个数组,因为你使用的是$wpdb-&gt;get_results,所以你需要像这样使用join

foreach ($operator_rates as $operator_rate) {
    $numbering = $wpdb->get_results("SELECT numbering FROM melitawordpress.prepaid_telephony_rates");
    echo '
                <strong>' . $operator_rate->operator . '</strong><br/>';
    $numbers = array();
    foreach ($numbering as $number) {
        $numbers[] = $number->numbering;
    }
    echo join(", ", $numbers) . "<br />";
}

编辑:$wpdb-&gt;get_results 返回对象。

【讨论】:

  • 这给了我以下错误:Catchable fatal error: Object of class stdClass could not be convert to string in //directory on line 87
  • 似乎到了那里但是我收到了这个错误:警告:join() [function.join]: Invalid arguments pass in //directory on line 91
  • 哦,我的错。我忘了将它添加为 $numbers 的数组。我已经编辑了我的代码。在变量名后添加[] 以将其添加为新元素。
  • 由于某种原因,它现在破坏了代码,因为只有白页正在加载。似乎错误是向下创建数组引起的,因为当我删除该部分时它工作正常。
  • 在循环内,注释掉这个:$numbers[] = $number-&gt;numbering; 并说:var_dump($number) 请显示结果。
【解决方案3】:

使用内爆函数,例如

foreach ($operator_rates as $operator_rate) {
$numbering = $wpdb->get_results("SELECT numbering FROM melitawordpress.prepaid_telephony_rates");
echo '
            <strong>' . $operator_rate->operator . '</strong><br/>';
echo implode(", ", $numbering) . "<br />";

}

【讨论】:

    【解决方案4】:

    您的查询返回多行。

    数组正在打印,所以它显示Array

    您需要通过用逗号, 连接数组元素来获取格式化字符串。

    使用group_contact()

    输入

    $numbering = $wpdb->get_results("SELECT GROUP_CONCAT(numbering SEPARATOR ', ') AS numbering
    FROM melitawordpress.prepaid_telephony_rates");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2014-02-05
      • 1970-01-01
      • 2016-03-31
      • 2014-11-29
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多