【问题标题】:How to create strings in for loop with SELECT using variable variables PHP如何使用可变变量 PHP 在 for 循环中创建字符串
【发布时间】:2019-01-04 22:39:48
【问题描述】:

我在哪里弄错了,得到如下所示的输出?

  1. 数组内部是表的名称。

假设在这些表中有 0 行,所以任何地方都应该是 0 作为输出。

<?php
$g_module =
array(
  'm_b_broadcast_live',
  'm_b_browsing_live',
  'm_e_askfm_likes_live',
  'm_e_facebook_followers_live',
  'm_e_facebook_group_joins_live',
);

for ($i = 0; $i <= 5; $i++) {
  $modules_names = "g_module[$i]";
  $modules_from = '$'.$modules_names;

  $modules_rows = '$g_module_row_'.$i;

  $$modules_rows = mysql_num_rows("SELECT * FROM $$modules_from");
}

echo $g_module_row_1;
echo '</br>';
echo $g_module_row_2;
echo '</br>';
echo $g_module_row_3;
echo '</br>';
echo $g_module_row_4;
echo '</br>';
echo $g_module_row_5;

/* output should be:
0

0

0

0

0
*/
?>

【问题讨论】:

  • mysql_num_rows() 接受一个结果集,而不是一个包含 SQL 语句的字符串。它也已弃用,因此不再受支持。您可能需要考虑使用 PDO 或 mysqli 运行基本 SQL 语句。
  • 警告:不要使用在 PHP 7 中删除的过时的mysql_query 接口。PDO is not hard to learn 之类的替代品和PHP The Right Way 之类的指南有助于解释最佳实践.这里的参数是 NOT properly escaped 并且在这段代码中有严重的 SQL injection bugs。转义任何和所有用户数据,尤其是来自$_POST$_GET
  • 使用可变变量(例如$$x)在最好的情况下风险极大。在 SQL 查询中使用变量变量是鲁莽的。不要这样做。只需在其中创建一个数组 $g_module_rowspush 即可。不要使用$$ 创建变量堆。
  • 使用数组的一个很好的理由是你可以迭代它们。你不能用成堆的变量轻易地做到这一点。这 9 行复制粘贴的代码可以归结为 4 行灵活的代码,它们可以通过简单的 for 循环处理 N 行。

标签: php mysql string variables for-loop


【解决方案1】:

正如您的问题的 cmets 中所述,mysql_num_rows() 将查询结果作为参数,而不是查询字符串。
此外,您应该使用 mysqli!查看文档here

您可以简化的其他事情是将美元符号转义,这样您就不必再次将一个连接到$modules_names

更正后的代码如下所示:

<?php
$g_module = [
    'm_b_broadcast_live',
    'm_b_browsing_live',
    'm_e_askfm_likes_live',
    'm_e_facebook_followers_live',
    'm_e_facebook_group_joins_live',
];

// you have to create a connection to your database server first
// of course you will have to swap out my placeholders for the actual credentials
$con=mysqli_connect('mysql_server_address_here','username_here','password_here','database_name_here');

for($i=0;$i<=5;$i++){
    $modules_from = "\$g_module[$i]";

    $modules_rows = "\$g_module_row_$i";

    $q=mysqli_query("SELECT * FROM $$modules_from");

    //use mysqli_num_rows instead
    $$modules_rows = mysqli_num_rows($q);
}

// close your connection after you are finished
mysqli_close($con);

echo $g_module_row_1;
echo '</br>';
echo $g_module_row_2;
echo '</br>';
echo $g_module_row_3;
echo '</br>';
echo $g_module_row_4;
echo '</br>';
echo $g_module_row_5;

【讨论】:

  • mysql_query mysqli
  • 另外,如果你打算使用mysqli,至少使用面向对象的接口。它不那么冗长,并且不会意外与mysql_query 系列函数混淆,从而节省大量时间寻找丢失的i
  • 对不起@tadman,我从一开始就一直使用程序 mysqli 函数或 PDO。因为 OP 使用了mysql,所以我坚持使用它(i 除外)。如果您愿意,随时欢迎添加包含 PDO 或您认为是最佳解决方案的其他答案。
  • 是的,我在这里有点特别,但我看到太多的问题,人们几乎没有从mysql_querymysql_query 的糟糕旧方式中改变,并存在相同的缺陷。使用面向对象的风格可以更彻底地打破并避免一大堆问题,因此值得推广。或者如你所说的 PDO!
【解决方案2】:
<?php
    $g_module =
    array(
        'm_b_broadcast_live',
        'm_b_browsing_live',
        'm_e_askfm_likes_live',
        'm_e_facebook_followers_live',
        'm_e_facebook_group_joins_live',
    );

    foreach($g_module as $table_name){
        $count = mysql_num_rows("SELECT * FROM $table_name");
        echo "<br/>".$count;
    }
?>

我认为你应该这样尝试。

【讨论】:

  • mysql_num_rows 接受结果,而不是字符串。此代码需要修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2015-12-26
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多