Php Mysql\u fetch\u行未使用多个结果填充会话数组
您好,这是我的解决方案,因为我听取了一些关于SQL语句的建议。。。谢谢大家Php Mysql\u fetch\u行未使用多个结果填充会话数组,php,mysql,session-variables,Php,Mysql,Session Variables,您好,这是我的解决方案,因为我听取了一些关于SQL语句的建议。。。谢谢大家 $connection = ConnectionBD(); $tag = $_SESSION['nomUtilisateur']; $panier= array(); $requete = mysql_query("SELECT * FROM cours INNER JOIN elevecours ON cours.idcours = elevecours.IDCours WHERE elevecours.IDEleve
$connection = ConnectionBD();
$tag = $_SESSION['nomUtilisateur'];
$panier= array();
$requete = mysql_query("SELECT * FROM cours INNER JOIN elevecours ON cours.idcours = elevecours.IDCours WHERE elevecours.IDEleve= '$tag'",$connection);
$H = 0;
if(mysql_num_rows($requete) != 0)
{
while($row = mysql_fetch_row($requete))
{
//$panier[] = $row;
$_SESSION['Panier']['Id'][$H] = $row[0];
$_SESSION['Panier']['CodeCours'][$H] = $row[1];
$_SESSION['Panier']['Titre'][$H] = $row[2];
$_SESSION['Panier']['Prealable'][$H] = $row[3];
$_SESSION['Panier']['NbHeure'][$H] = $row[4];
$_SESSION['Panier']['Session'][$H] = $row[5];
$_SESSION['Panier']['Credit'][$H] = $row[6];
$H ++;
}
}
mysql_close($connection);
您需要在循环中的每个迭代中获取一次行
for($i = 0; $i < mysql_num_rows($req); $i++) {
$resultat = mysql_fetch_row($req);
//the rest of your code goes here
}
for($i=0;$i
在第二个foreach循环中设置$H=0;然后$H++在同一个循环中,这将不会正确增加,因为下次它再次经过循环时,$H=0;语句将导致该值变为0,因此会一直覆盖数据,直到循环完成,并且最后只剩下一个$\u会话值
for($j = 0; $j < count($panier); $j++)
{
if($resultat[$i] == $panier[$j][0])
{
$H = 0; <-- sets to zero on every interation
$_SESSION['Panier']['Id'][$H] = $result[0];
$_SESSION['Panier']['CodeCours'][$H] = $result[1];
$_SESSION['Panier']['Titre'][$H] = $result[2];
$_SESSION['Panier']['Prealable'][$H] = $result[3];
$_SESSION['Panier']['NbHeure'][$H] = $result[4];
$_SESSION['Panier']['Session'][$H] = $result[5];
$_SESSION['Panier']['Credit'][$H] = $result[6];
$H++;
}
}
for($j=0;$j $H=0;这些是我的测试变量
$session = array();
$panier = array(array(1,'one'),array(2,'two'),array(3,'three'),);
$req = array(
array(1,'one','Titre1','Prealable1','NbHeure1','Session1','Credit1'),
array(2,'two','Titre2','Prealable2','NbHeure2','Session2','Credit2'),
array(3,'three','Titre3','Prealable3','NbHeure3','Session3','Credit3'),
array(4,'four','Titre4','Prealable4','NbHeure4','Session4','Credit4'),
array(5,'five','Titre5','Prealable5','NbHeure5','Session5','Credit5'),);
我写的代码不完全依赖于数据库和数据,因为我不知道它是什么…不知道。切换这些代码行以使用数据库的东西
// $req = mysql_query("SELECT * FROM cours", $connection); uncomment this line for your code
if ($req!==false)
{
foreach( $req as $i => $resultat ) // testing row, remove for real
// while( $resultat = mysql_fetch_row($req) ) // real row, uncomment for you
{
$compare = $resultat[0];
// we will be using $compare to see if this row
// matches one in $panier.. this needs to be changed
// appropriately. I don't have enough info to define it....
// this needs to be a unique field, or it should be
// it is going to be used like this: if($resultat[$i] == $panier[$j][0])
$result[ $compare ] = $resultat;
}
$hi = 0;
foreach( $panier as $index => $panier_row )
{
$compare = $panier_row[0];
if (isset($result[$compare]))
{
$H = 0;
// change $session to $_SESSION for your code...
$session['Panier']['Id'][$hi][$H] = $result[$compare][0];
$session['Panier']['CodeCours'][$hi][$H] = $result[$compare][1];
$session['Panier']['Titre'][$hi][$H] = $result[$compare][2];
$session['Panier']['Prealable'][$hi][$H] = $result[$compare][3];
$session['Panier']['NbHeure'][$hi][$H] = $result[$compare][4];
$session['Panier']['Session'][$hi][$H] = $result[$compare][5];
$session['Panier']['Credit'][$hi][$H] = $result[$compare][6];
$H++;
$hi++;
}
}
}
我的结果显示,$session['Panier']['Credit']
为1、2、3而不是4或5设置了三个对象,因为它们不匹配$Panier
在所有这些结束时,$session
中有什么内容:
array (
'Panier' =>
array (
'Id' =>
array (
0 =>
array (
0 => 1,
),
1 =>
array (
0 => 2,
),
2 =>
array (
0 => 3,
),
),
'CodeCours' =>
array (
0 =>
array (
0 => 'one',
),
1 =>
array (
0 => 'two',
),
2 =>
array (
0 => 'three',
),
),
'Titre' =>
array (
0 =>
array (
0 => 'Titre1',
),
1 =>
array (
0 => 'Titre2',
),
2 =>
array (
0 => 'Titre3',
),
),
'Prealable' =>
array (
0 =>
array (
0 => 'Prealable1',
),
1 =>
array (
0 => 'Prealable2',
),
2 =>
array (
0 => 'Prealable3',
),
),
'NbHeure' =>
array (
0 =>
array (
0 => 'NbHeure1',
),
1 =>
array (
0 => 'NbHeure2',
),
2 =>
array (
0 => 'NbHeure3',
),
),
'Session' =>
array (
0 =>
array (
0 => 'Session1',
),
1 =>
array (
0 => 'Session2',
),
2 =>
array (
0 => 'Session3',
),
),
'Credit' =>
array (
0 =>
array (
0 => 'Credit1',
),
1 =>
array (
0 => 'Credit2',
),
2 =>
array (
0 => 'Credit3',
),
),
),
)
但就个人而言……您应该使用mysql\u fetch\u assoc
并这样做:
$session = array();
$panier = array(array(1,'one'),array(2,'two'),array(3,'three'),);
$req = array(
array('id'=>1,'var'=>'one','Titre'=>'Titre1','Prealable'=>'Prealable1','NbHeure'=>'NbHeure1','Session'=>'Session1','Credit'=>'Credit1'),
array('id'=>2,'var'=>'two','Titre'=>'Titre2','Prealable'=>'Prealable2','NbHeure'=>'NbHeure2','Session'=>'Session2','Credit'=>'Credit2'),
array('id'=>3,'var'=>'thr','Titre'=>'Titre3','Prealable'=>'Prealable3','NbHeure'=>'NbHeure3','Session'=>'Session3','Credit'=>'Credit3'),
array('id'=>4,'var'=>'fou','Titre'=>'Titre4','Prealable'=>'Prealable4','NbHeure'=>'NbHeure4','Session'=>'Session4','Credit'=>'Credit4'),
array('id'=>5,'var'=>'fiv','Titre'=>'Titre5','Prealable'=>'Prealable5','NbHeure'=>'NbHeure5','Session'=>'Session5','Credit'=>'Credit5'),);
// $req = mysql_query("SELECT * FROM cours", $connection);
if ($req!==false)
{
foreach( $req as $i => $resultat ) // testing row, remove for real
// while( $resultat = mysql_fetch_assoc($req) ) // real row, uncomment for you
// mysql_fetch_assoc !!
{
$compare = $resultat['id'];
// we will be using $compare to see if this row
// matches one in $panier.. this needs to be changed
// appropriately. I don't have enough info to define it....
// this needs to be a unique field, or it should be
$result[ $compare ] = $resultat;
}
foreach( $panier as $index => $panier_row )
{
$compare = $panier_row[0];
if (isset($result[$compare]))
{
$session[] = $result[$compare];
}
}
}
这是$session
array (
0 =>
array (
'id' => 1,
'var' => 'one',
'Titre' => 'Titre1',
'Prealable' => 'Prealable1',
'NbHeure' => 'NbHeure1',
'Session' => 'Session1',
'Credit' => 'Credit1',
),
1 =>
array (
'id' => 2,
'var' => 'two',
'Titre' => 'Titre2',
'Prealable' => 'Prealable2',
'NbHeure' => 'NbHeure2',
'Session' => 'Session2',
'Credit' => 'Credit2',
),
2 =>
array (
'id' => 3,
'var' => 'thr',
'Titre' => 'Titre3',
'Prealable' => 'Prealable3',
'NbHeure' => 'NbHeure3',
'Session' => 'Session3',
'Credit' => 'Credit3',
),
)
你的问题是什么?你可以不增加$R
而只做$panier[]=…
,它会在数组上给你一个连续的数字索引。你发现while($row=mysql\u fetch\u row($requete))
和$resultat=mysql\u fetch\u row($req)之间的明显区别了吗
?这是两项…?您希望得到两个结果,对吗?$panier[0]
是第一项,$panier[1]
是第二行/result/thing…//这就是显示var_dump:array(2){[0]=>array(1)
(我很困惑这里的目标是什么…)mysql.*
函数不再维护,不应在任何新的代码库中使用。它正在被淘汰,取而代之的是更新的API。相反,您应该与或一起使用。if($resultat!==false){while($resultat=mysql.\u fetch_row($req)){…}
更好…$result
在他上面的代码中没有定义。(我很沮丧)…不要给出包含它的解决方案。$result
为空。$resultat
是单行,而不是2D数组(顺便说一句)考虑到$resultat应该是$result这一疑问,代码在当前状态下根本不应该工作。不管怎样,问题是为什么只填充了一个会话值。答案指出他在for循环中重置了索引。但这不是问题所在。在最内部的代码中,$result
不是递增的,而\u会话
是递增的,所以最终的计划只是让计数($panier)
将$result
的副本复制到\u会话
?根据一篇评论文章(我想)说,$panier
,在我们知道之前,任何人都无法回答这个问题,他们希望返回许多行,希望与$panier
进行比较,并将至少一行从数据库复制到\u会话中。问题是…他们的变量有一半未定义。他们没有返回多个结果,因为他们只执行一次mysql\u获取行
,我不知道他们实际拥有多少数据ant在\u session
…是的,就像有人说的,他们应该在查询中过滤,而不是使用PHP数组。但是谁知道呢…在问题$panier=array();的代码的第二部分中,通过引用传递到saveBasket(&$panier,$connection)。所以让我们假设$result=mysql\u fetch\u行。然后$result[0]将在索引0处收集当前行数组的值,以此类推。不确定误解是什么?他没有问“为什么我的代码不起作用”,而是问“为什么我的会话只存储一个值”。您很好地指出,这个问题无法从“修复我的代码”中得到回答透视图,但他没有问这个问题。你好,我找到了解决方案,并编辑了我的帖子。非常感谢你。