如何使用变量PHP在带有SELECT的for循环中创建字符串
我在哪里犯了一个错误,像下面写的那样获取了输出?如何使用变量PHP在带有SELECT的for循环中创建字符串,php,mysql,string,variables,for-loop,Php,Mysql,String,Variables,For Loop,我在哪里犯了一个错误,像下面写的那样获取了输出? 数组内部是表的名称 假设这些表中有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 <=
<?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\u num\u rows()
将查询结果作为参数,而不是查询字符串。另外,您应该使用mysqli!查看文档 您可以简化的另一个方法是转义美元符号,这样您就不必再次将美元符号连接到
$modules\u name
更正后的代码如下所示:
<?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\u num\u rows()
接受结果集,而不是包含SQL语句的字符串。它也不推荐使用,因此不再受支持。您可能需要考虑使用PDO或mysqli运行基本SQL语句。警告:不要使用PHP7中删除的过时接口。替换类和指南类有助于解释最佳实践。这里没有参数,这在代码中有严重的错误。转义任何和所有用户数据,特别是从$\u POST
或$\u GET
转义。在最好的情况下,使用变量(例如$$x
)是非常危险的。在SQL查询中使用变量是鲁莽的。不要这样做。只需创建一个数组$g_module_rows
并将东西推入其中。不要使用$$
创建变量堆。使用数组的一个很好的理由是,您可以对它们进行迭代。使用成堆的变量很难做到这一点。这九行复制粘贴的代码可以归结为四行灵活的代码,它们可以通过一个简单的for
循环处理N行。mysql\u查询mysqli
mysqli
至少要使用面向对象的接口。它不会太冗长,也不会意外地与mysql\u query
函数系列混淆,从而节省了大量时间查找缺少的i
。抱歉@tadman,我现在从一开始就一直使用程序性mysqli函数或PDO。因为OP使用了mysql
,所以我坚持使用它(除了I
)。如果你愿意,欢迎你添加另一个包含PDO或你认为最好的解决方案的答案。是的,我在这里有点特别,但我看到太多的问题,人们几乎没有从垃圾的老方法mysql\u query
到mysql\u query
,存在同样的缺陷。使用面向对象的风格可以更彻底地解决问题,避免大量问题,因此值得推广。或者PDO,就像你说的mysql\u num\u rows
接受结果,而不是字符串。这段代码需要修复。
<?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;