【问题标题】:Assigning skills to a user, but it only works for skills in the array; skills only in the array if the user owns them将技能分配给用户,但它仅适用于数组中的技能;如果用户拥有技能,则仅在数组中
【发布时间】:2016-02-14 13:19:17
【问题描述】:

我正在尝试为帐户持有人创建一个表单,以使用他们的个人资料中的 INSERTUPDATEDELETE 技能。但是它只适用于数组中的技能,但数组只包含用户已经分配给他们的技能。 IE。如果我使用SQL insert to the DB 向用户添加技能,然后测试它工作正常的功能。无论他们是否拥有这项技能,我怎样才能让我的代码结构正常工作?

(我已经将大量代码复制到这个问题中,因为之前的问题收到了更多代码的请求)。

PHP 代码:

$User = (int)$_SESSION["UserID"];

    $skillresult = $con->query("SELECT userskills.`SkillID`, `Description`, `Experience` 
        FROM `User` 
        INNER JOIN `userskills` ON User.`UserId` = userskills.`UserId` 
        LEFT OUTER JOIN `Skills` ON userskills.`SkillID` = Skills.`SkillID` 
        WHERE user.`UserID` ='$User'") 
    or die(mysqli_error($con));

    $skills_array = array();

    while($r=mysqli_fetch_array($skillresult))
    {
    $skills_array[$r['SkillID']] = $r['Description'];
    }
    print_r($skills_array);

    if(isset($_POST['Update']))
    {

            $default = 0;

            foreach($skills_array AS $skills_id=>$skills_name)
            {
                if (isset($_POST[$skills_name]))
                {
                    if (empty($_POST[$skills_name.'exp']))
                    {
                        $exp = $default;
                    }
                    else
                    {
                        $exp = $_POST[$skills_name.'exp'];
                    }

                    $sql = $con->query("SELECT count(`UserID`) as total FROM `userskills` WHERE `UserID` = '$User' AND `SkillID` = ".$skills_id) 
                    or die(mysqli_error($con));

                    if ($row1 = mysqli_fetch_assoc($sql))
                    {
                        $sql = $con->query("UPDATE `userskills` SET `Experience` = '$exp' WHERE `UserID` = '$User' AND `SkillID` = ".$skills_id)
                        or die(mysqli_error($con));
                        //If the checkbox is not checked it will check to see if skill is already a skill assigned to the user. If they are it will delete it. If not it will ignore.   
                    }
                    else
                    {
                        $sql = $con->query("INSERT INTO `userskills` ( `UserID`, `SkillID`, `Experience`) VALUES  ('$User', '$skills_id', '$exp')")
                        or die(mysqli_error($con));
                    }
                } 
                else
                {
                    $sql = $con->query("DELETE FROM `userskills` WHERE `UserID` = '$User' AND `SkillID` = ".$skills_id)
                    or die(mysqli_error($con));
                }
            }

            header('Location: Account.php');
            die();
        }
        else
        {
            echo 'Incorrect password please try again.';
        }
    }

HTML+PHP 代码:

<div class="container">
        <h1 class="page-header"></h1>
        <div class="row">
            <form id="form1" name="form1" method="post" enctype="multipart/form-data" class="form-horizontal" role="form">

        <div class="col-md-8 col-sm-6 col-xs-12 personal-info">
            <h3>Personal Info:</h3>
                <div class="form-group">

                <h3>Skills:</h3>
                <?php

                $result1 = $con->query("SELECT skills.`SkillID`, skills.`Description`, COUNT(userskills.`SkillID`) AS SkillUserHas, MAX(`Experience`) AS Experience
                                        FROM `skills`
                                        LEFT OUTER JOIN `userskills`
                                        ON skills.`SkillID` = userskills.`SkillID` AND userskills.`UserID` = '$User'
                                        GROUP BY skills.`SkillID`, skills.`Description`
                                        ORDER BY FIELD(skills.`SkillID`, 1, 7, 9, 3, 4, 5, 6, 8)") 
                                        or die(mysqli_error($con));

                ?>

                <table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Skill(s)</th>
                            <th>Experience (Years)</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                          while ($skillrow = $result1->fetch_assoc())
                        {
                            echo '<tr>';
                            echo '<td><label>';
                            echo '<input type="checkbox" name="'.$skillrow['Description'].'" id="CheckboxGroup1_'.$skillrow['SkillID'].'" class="skillselect" value="yes" '.(($skillrow['SkillUserHas'] > 0) ? 'checked' : '').'>';
                            echo $skillrow['Description'].'</label></td>';
                            echo '<td><input type="number" name="'.$skillrow['Description'].'exp" class="expnumber" placeholder="Enter Experience in years." value="'.$skillrow['Experience'].'"></td>';
                            echo '</tr>';
                        }
                        ?>
                    </tbody>
                </table>
        </div>
            </form>
  </div>
</div>

【问题讨论】:

    标签: php mysql sql arrays


    【解决方案1】:

    您可以使用单独的 SQL 查询预先加载所有可用的技能,然后将它们与用户拥有的技能进行比较。

    您也可以使用 LEFT JOIN,其中 userskills 作为第一个表,然后您将拥有所有不属于用户的技能,用户 ID 为 NULL。

    【讨论】:

    • 你能给我举个例子来说明你对Left Join的意思吗?我已经玩过它了,但担心我可能没有尝试过你的意思。
    • 类似于:'SELECT * FROM userskills us LEFT JOIN User u ON u.UserId = us.UserId WHERE u.UserID ='$User '"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多