我应该使用哪个SQL请求?

邪恶的狐狸

我有桌子SkillsResult

___ 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用户的信息,但是不知道在请求中的位置

史蒂文

关于SQL的一点点

one-manyMatieres表和Resultat之间似乎存在关系

SELECT...JOIN在这种情况下使用语句时,您有效地返回的Matieres次数与中的匹配次数相同Resultat

例如:

  1. 假设你有技能/功课 can touch toes
  2. 假设有5记录Resultatusers谁有技巧

使用当前的查询结构,您可以执行以下操作:

__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

你的问题

假设条件

  1. 您已user登录到该网站,$_SESSION["id"] == Resultat.ID_USER
  2. 您想要SELECT所有Matieres.id && Matieres.Nom AND Resultat.RESULTAT,并且已经为此记录了任何技能Resultat.ID_USER
  3. 您正在使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章