0

ユーザーが利用可能なスキルを選択するフォームがあります。

<form name="myForm" action="jssearch.php" method="post">

 <input type="checkbox" name="chk1[]" value="1">Helpdesk Support
 <input type="checkbox" name="chk1[]" value="2">DB Admin<br>
 <input type="checkbox" name="chk1[]" value="3">C++ Programming
 <input type="checkbox" name="chk1[]" value="5">HTML<br>
 <input type="checkbox" name="chk1[]" value="6">PHP<br>
 <input type="checkbox" name="chk1[]" value="7">Memory Dump Analysis<br>
 <input type="checkbox" name="chk1[]" value="8">SQL<br><br>

 <input type="submit" name="Update" value="Search">

</form> 

これらの選択に基づいて、多対多テーブルに対してクエリを実行し、選択したスキルを含む利用可能なジョブを表示したいと考えています。

これまでの私のクエリは次のとおりです。

<?php

session_start();
mysql_connect("localhost", "root", "root") or die(mysql_error());
mysql_select_db("jobsearch") or die(mysql_error());

$variable=$_POST['chk1'];
foreach ($variable as $variablename)
{
    $query = mysql_query(
       "SELECT jobs.jobid AS job_id, jobs.jobtitle AS
        job_title,jobs.salary AS salary_desc, GROUP_CONCAT(skills.Desc) AS skills_desc    
        FROM jobskillsjoin
        INNER JOIN jobs ON jobs.jobid = jobskillsjoin.JobID
        INNER JOIN skills ON skills.skill_id = jobskillsjoin.SkillID
        WHERE skills.skill_id = '".$variablename."'
        GROUP BY jobs.jobid
        ")
    or die(mysql_error());
}

echo "<table border='1'>
<tr>
<th>Job ID</th>
<th>Job Title</th>
<th>Skills required</th>
<th>Salary Offered</th> 
</tr>";

while($row = mysql_fetch_array($query))
{
    echo "<tr>";
    echo "<td>" . $row['job_id'] . "</td>";
    echo "<td>" . $row['job_title'] . "</td>";
    echo "<td>" . $row['skills_desc'] . "</td>";
    echo "<td>" . $row['salary_desc'] . "</td>"; 
    echo "</tr>";
}
echo "</table>";


?>

ただし、最後に選択されたスキルのみがクエリで実行されます。ただし、すべての「ヒット」を表示したい。

ループと配列が必要だと思いますが、その方法がわかりません。

4

1 に答える 1

2

あなたがしたようにチェックボックスを送信すると、PHP側の配列になります。where句でこの配列を使用する必要があります。関数 implode を使用して配列を文字列に変換し、演算子 "in" を使用します。したがって、where句は次のようになります。

$query = mysql_query("SELECT jobs.jobid AS job_id, jobs.jobtitle AS
        job_title,jobs.salary AS salary_desc, GROUP_CONCAT(skills.Desc) AS skills_desc    
    FROM jobskillsjoin
    INNER JOIN jobs ON jobs.jobid = jobskillsjoin.JobID
    INNER JOIN skills ON skills.skill_id = jobskillsjoin.SkillID
    WHERE skills.skill_id in (". implode(",",$_POST['chk1']) .")
    GROUP BY jobs.jobid
    ")

このようにして、クエリはチェックされたすべてのスキルを返します。

少なくとも 1 つのスキルが選択されているジョブのすべてのスキルを返すには、クエリ ロジックを次のように変更する必要があります。

SELECT j.jobid AS job_id, j.jobtitle AS
            job_title, GROUP_CONCAT(skills_Desc) AS skills_desc    
        FROM jobskillsjoin
        INNER JOIN jobs j ON j.jobid = jobskillsjoin.JobID
        INNER JOIN skills ON skills.skill_id = jobskillsjoin.SkillID
where exists(select 1 from jobskillsjoin where jobid = j.jobid and SkillID in (1,2))
        GROUP BY j.jobid;

クエリを変更することに注意してください。コードにコピー アンド ペーストしないでください。何も見逃さないように調整してください。

于 2013-05-01T15:21:18.203 に答える