Php 在循环中查询数据库
我有多个下拉菜单。当用户单击提交按钮时。if子句中的isset函数是triggerd,执行以下代码Php 在循环中查询数据库,php,mysqli,Php,Mysqli,我有多个下拉菜单。当用户单击提交按钮时。if子句中的isset函数是triggerd,执行以下代码 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 e
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);
}
}
if(设置($\u POST[“提交”]))
{
$player_id=$_请求['players'];
变量转储($player\u id);
对于($i=0;$i
上面的代码应该做的是返回玩家的名字和用户选择。但是,当我打开它时,我会看到:
注意,我在第一个var_转储中使用的$player_id数组包含不同的player_id值
但是,当我对第二个数组$selected执行var_转储时,该数组只包含值“Burger”
我怀疑问题在于foreach循环和查询数据库的方式。如果有人能给我指出正确的方向,我将不胜感激。
提前感谢。删除
for
循环,它应该可以工作。您希望迭代每个玩家id,您正在使用foreach
执行此操作。不需要外部的。使用原力,卢克!
有了抽象库,它将是两行代码
$sql = 'SELECT name FROM player_info WHERE player_id in (?a)';
$names = $db->getCol($sql,$_POST['players']);
而且,与您的不同,它是安全的,不需要注射。您实际上是在运行同一个循环两次。取出
for($i=0; $i < sizeof($player_id); $i++){}
for($i=0;$i
你在无缘无故地重复循环
另外,当您为每个玩家id执行一个SELECT
时,您试图在foreach
之外迭代结果,这意味着您只迭代最后一个
此外,如果您的SELECT
s最多生成一行,则它们都不需要迭代
试着这样做:
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!";
}
}
($i=0;$i
的循环是一个过度循环。您没有使用此循环中的$i
,因此不需要它。想象一下,如果$player\u id数组有3个项目,您将循环它,在循环的每一步中,您还将使用foreach
loop再次循环整个$player\u id数组
此外,您正在使用不安全的方法在查询中传递变量。我认为最好的做法是养成一种习惯,将收入$\u POST变量转换为int
,如果建议它们是数字的话。它只是一个字符串$player\u id=array\u map('intval',$请求['players')
,或$id=(int)$\u POST['id']
,或$number=(int)$\u GET['number']
,等等
另一件事是过度查询数据库。与为每个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);
}
为什么同时使用for
和foreach
循环?我想指出的是,这个脚本对于SQL注入非常脆弱。最佳做法是使用占位符。是的,你是对的,我对你使用占位符的答案投了一票。但是本机PHP不提供使用占位符的机会。:)另外,我会将您的答案改写为:$names=$db->getCol('selectname FROM player_info WHERE player_id in(?a),$_POST['players'])代码>。这种变体将使用更大的力。))当然,原生PHP允许占位符,即使使用旧的mysql ext。用户定义的函数也是原生的。一行变量的可读性较差-这就是为什么应该避免使用它。我只是对一个字符串变量开玩笑,没关系。我的变体带有$query='..'
))