我有多个下拉菜单。当用户单击“提交”按钮时。触发if子句中的isset函数并执行以下代码
if(isset($_POST["submit"]))
{
$player_id = $_REQUEST['players'];
var_dump ($player_id);
for($i=0; $i < sizeof($player_id); $i++) //query database with different player_id each time
{
foreach ($player_id as $id){
$query = 'SELECT `name` FROM `player_info`
WHERE `player_id` = '.$id;
$return_names = mysql_query($query) or die(mysql_error());
}
while($row = mysql_fetch_array($return_names))
{
$selected[] = $row['name'];
}
var_dump($selected);
}
}
以上代码应该做的是返回玩家的名字,所选用户。但是,当我打开它时,我得到了这个:
注意我在第一个var_dump中使用的$ player_id数组包含不同的player_id值。
但是当我在第二个数组$上选择var_dump时,数组只包含值&#34; Burger&#34;
我怀疑问题出现在foreach循环中以及我查询数据库的方式。如果有人能指出我正确的方向,我将不胜感激。 提前谢谢。
答案 0 :(得分:2)
使用力量,卢克! 对于像safeMysql这样的抽象库,它将是两行代码行
$sql = 'SELECT name FROM player_info WHERE player_id in (?a)';
$names = $db->getCol($sql,$_POST['players']);
并且,与您的不同 - 注射时安全。
答案 1 :(得分:0)
删除for
循环,它应该有效。您想要使用foreach
迭代每个玩家ID。 1}}外面不需要它。
答案 2 :(得分:0)
你实际上是在运行两次相同的循环。拿出
for($i=0; $i < sizeof($player_id); $i++){}
答案 3 :(得分:0)
循环for($i=0; $i < sizeof($player_id); $i++)
是一个过度循环。您没有在此循环中使用$i
,因此您不需要它。试想一下,如果你的$ player_id数组有3个项目,你将循环它,并且在这个循环的每一步中,你还将使用foreach
循环再循环整个$ player_id数组。
此外,您使用不安全的方法在查询中传递变量。我认为最佳实践是习惯将收入$ _POST变量转换为int
,如果它们被建议为数字。它只是一个字符串$player_ids = array_map('intval', $_REQUEST['players']);
,或$id = (int)$_POST['id']
,或$number = (int)$_GET['number']
等。
另一件事就是过度使用你的数据库。您可以对IN
运算符使用一个查询,而不是为每个ID创建单独的查询,右侧是逗号连接的所有ID。
您的代码的另一个安全变体是:
if ( isset($_POST['submit']) ) {
$player_ids = array_map('intval', $_REQUEST['players']);
//var_dump($player_ids);
$query = 'SELECT `name`
FROM `player_info`
WHERE `player_id` IN (' . implode(',', $player_ids) . ')';
$return_names = mysql_query($query) or die(mysql_error());
while ( $row = mysql_fetch_assoc($return_names) ) {
$selected[] = $row['name'];
}
//var_dump($selected);
}
答案 4 :(得分:-1)
你无缘无故地进行双循环。
此外,当您为每个玩家ID执行一个SELECT
时,您尝试在foreach
之外迭代结果,这意味着您最终只迭代最后一个。
此外,如果SELECT
只生成一行,则if(isset($_POST["submit"]))
{
$player_id = $_REQUEST['players'];
var_dump ($player_id);
foreach ($player_id as $id)
{
$query = 'SELECT `name` FROM `player_info` WHERE `player_id` = '.$id;
$return_names = mysql_query($query) or die(mysql_error());
$row=mysql_fetch_array($return_names); // at most one -- or not?
if($row)
{
$selected=$row['name'];
var_dump($selected);
}
else
echo "Player with id $id not found in DB!";
}
}
都不需要迭代。
试试这样:
{{1}}