我有桌子Skills
和Result
___ Matieres ___ ___ Resultats ___
id (int auto increment) ID (int auto_increment)
Nom (varchar) TIME_OF_INSERTION (datetime current_timestamp)
Categorie (varchar) ID_USER (int)
Active (boolean) ID_MATIERE (int)
RESULTAT (int)
我有以下代码可基于查询的数据创建表单:
$req = $bdd->query(SELECT * FROM Matieres LEFT JOIN Resultats ON Matieres.id = Resultats.ID_MATIERE WHERE Active = TRUE);
$skills = [];
while( $data = $req->fetch()) {
array_push( $skills, [ $data['id'], $data['Nom'], $data['RESULTAT'] ] );
}
function setWidgetValue( $skill ) {
if(is_null($skill[2])) {
$value = 0;
} else {
$value = $skill[2];
}
$widget = "<div class='m-5'><p>".$skill[1]."</p><input type='range' value='" . $value ."' class='form-control-range' min='0' step='1' max='10' id='".$skill[0]."' name='valSkill' onchange=\"MAJ_Value( ".$skill[0].", this.value, " . $_SESSION['id'] . " )\" ></div>";
return $widget;
}
function setAllWidgetValue( $skills ) {
$widget = "<div id='valSkills' >\n";
foreach( $skills as $skill )
$widget .= setWidgetValue( $skill );
$widget .= "</div>";
return $widget;
}
问题是我的输入的值应该是0
用户尚未发送的值,并且如果一个用户这样做就可以正常工作。但是,如果另一个用户尝试访问该表单,则输入将具有前一个用户提交的值。
我认为问题出在SQL请求中,但是我找不到一个运行良好的:(我知道我必须传递id
用户的信息,但是不知道在请求中的位置
您one-many
的Matieres
表和Resultat
表之间似乎存在关系?
SELECT...JOIN
在这种情况下使用语句时,您有效地返回的Matieres
次数与中的匹配次数相同Resultat
。
例如:
can touch toes
5
记录Resultat
了users
谁有技巧使用当前的查询结构,您可以执行以下操作:
__SQL:
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat ON Matieres.id = Result.ID_SKILL
__RESULTS:
Resultat.ID_USER Matieres.Nom Resultat.RESULTAT
1 can touch toes 50
2 can touch toes 71
3 can touch toes 23
4 can touch toes 88
5 can touch toes 20
要更改此行为,您需要在ON
子句中指定其他条件:
__SQL:
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
AND Resultat.ID_USER = 1
__RESULTS:
Resultat.ID_USER Matieres.Nom Resultat.RESULTAT
1 can touch toes 50
PHP while语句回显重复项:在此处查看答案,以获取更多信息和示例
不在这里
附加条件必须包含在该ON
子句中而不是该WHERE
子句中的原因是,您希望获得所有Active
技能/物质,无论有人是否已经为此获得了技能Resultat
。
如果我们将其放入WHERE
子句中,则会得到:
__SQL:
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
WHERE Resultat.ID_USER = 1
__RESULTS:
Resultat.ID_USER Matieres.Nom Resultat.RESULTAT
1 can touch toes 50
除非您考虑到您拥有多个技能/事项并且用户没有针对每个技能/事项的记录,否则这似乎没什么...例如:
__TABLES
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes 1 111 54
112 can handstand 1 112 60
113 can cartwheel 2 113 72
。
__SQL[1]: {For ID_USER == 1; using ON}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
AND Resultat.ID_USER = 1
__RESULT[1]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes 1 111 54
112 can handstand 1 112 60
113 can cartwheel NULL NULL NULL
__SQL[2]: {For ID_USER == 2; using ON}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
AND Resultat.ID_USER = 2
__RESULT [2]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes NULL NULL NULL
112 can handstand NULL NULL NULL
113 can cartwheel 2 113 72
__SQL[3]: {For ID_USER == 1; using WHERE}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
WHERE Resultat.ID_USER = 1
__RESULT[3]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
111 can touch toes 1 111 54
112 can handstand 1 112 60
__SQL[4]: {For ID_USER == 2; using WHERE}
SELECT Resultat.ID_USER, Matieres.Nom, Result.RESULTAT
FROM Matieres
LEFT JOIN Resultat
ON Matieres.id = Result.ID_SKILL
WHERE Resultat.ID_USER = 2
__RESULT[4]:
Matieres Resultat
id Nom ID_USER ID_MATIERE RESULTAT
113 can cartwheel 2 113 72
假设条件
user
登录到该网站,$_SESSION["id"] == Resultat.ID_USER
SELECT
所有Matieres.id && Matieres.Nom
AND Resultat.RESULTAT
,并且已经为此记录了任何技能Resultat.ID_USER
PDO
并且$bdd
是您与数据库的连接范例程式码
// SQL statement using `?` as a placeholder for the users id (from $_SESSION["id"]
// Add: "AND Resultats.ID_USER = ?" to ON clause to limit joined records to currently logged in user
$sql = "
SELECT Matieres.id, Matieres.nom, Resultats.RESULTAT
FROM Skills
LEFT JOIN Resultats ON Matieres.id = Resultats.ID_MATIERE AND Resultats.ID_USER = ?
WHERE Matieres.Active = TRUE
";
$req = $bdd->prepare($sql); // Prepare query
$req->execute([ $_SESSION["id"] ]); // Assign value to place holder and execute query
$skills = [];
while( $data = $req->fetch() ) {
$skills[] = [
"id"=>$data["id"],
"Nom"=>$data["Nom"],
"RESULTAT"=>$data["RESULTAT"]
];
}
function setWidgetValue( $skill ) {
// Set values outside of "widget" string for ease of reading
$value = ( is_null($skill["RESULTAT"]) ) ? 0 : $skill["RESULTAT"]; // Shorthand if statement using the ternary operator
$nom = $skill["Nom"];
$skill_id = $skill["id"];
$user_id = $_SESSION["id"];
// I've separated the code over several lines to make
// it easier to read you can of course change it back!
$widget = "
<div class='m-5'>
<p>{$nom}</p>
<input
type='range'
value='{$value}'
class='form-control-range'
min='0' step='1' max='10'
id='{$skill_id}'
name='valSkill'
onchange=\"MAJ_Value( {$skill_id}, this.value, {$user_id}
)\" >
</div>
";
return $widget;
}
function setAllWidgetValue( $skills ) {
$widget = "<div id='valSkills' >\n";
foreach( $skills as $skill )
$widget .= setWidgetValue( $skill );
$widget .= "</div>";
return $widget;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句