如何获取数据库值并将其与用户输入值匹配,并且仅显示匹配详细信息

时间:2014-01-27 07:10:26

标签: php

我有一个表格,员工可以根据自己的技能搜索学生的详细信息。 在表单中,我有一个选择框,员工可以在其中选择(java,php,android ...)等技能。选择一个值后,它将与存储在数据库中的多个值匹配,并仅显示技能匹配的记录。

但我得到意想不到的输出。

示例: - 员工选择技能为“C”。现在有两个学生在db和学生A有以下技能(C,java,php)和学生B有以下技能(css,android,dotnet)。所以根据输入,只有学生A应该显示,但我得到两个,因为学生B有一个名为'css'的值,这里c是一个起始字母表。

任何想法如何避免这种情况。我在php中使用了以下查询来获得结果。请帮我解决这个问题。

$skl = implode(",",$_REQUEST['serskil']);   
$qr = mysql_query("SELECT * FROM stdreg WHERE skills LIKE '%$skl%'"); 

4 个答案:

答案 0 :(得分:1)

$skl = $_REQUEST['serskil'];
SELECT * FROM stdreg WHERE FIND_IN_SET('$skl', skills)>0;

替代:

$skl = $_REQUEST['serskil'];
SELECT * FROM stdreg WHERE skills like '%,$skl' or skills like '$skl,%' or skills like '%,$skl,%';

<强> Reference on FIND_IN_SET

编辑:实际上,此代码不需要implode()。对不起,我错过了指定。

答案 1 :(得分:0)

试试这个

$skl = preg_split("/','/", $_REQUEST['serskil']);
$qr = mysql_query("SELECT * FROM stdreg WHERE skills LIKE '$skl'");

这将搜索确切的字符串。

答案 2 :(得分:0)

您的数据库结构未正常规范化。理想情况下,您需要一个像(例如skill_table)表那样的表:

skill_id | skill_name
--------- -----------
   1     |    C
   2     |    java
   3     |    php

另一张表,假设student_skill与学生的技能相匹配,如上表所示:

student_id  | skill_id
----------    --------
   S1       |    1      //Student s1 has skill C
   S1       |    2     //Student s1 has skill java
   S1       |    3    //Student s1 has skill php
   S2       |    1

有了这一切,你需要做的就是:

$skl = $_REQUEST['serskil'];
$qr = mysql_query("SELECT student_id FROM student_skill WHERE skill_id=(SELECT skill_id from skill_table where skill_name='".$skl."')"); 

//If `$_REQUEST['serskil']` is C, this query will output `S1`,`S2`

答案 3 :(得分:-1)

你可以尝试这种方法。

首先,您应该将数据库规范化到尽可能最佳的水平。在您的情况下,让我们创建一个名为'student'的表:

CREATE TABLE student (student_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, first_name varchar(20) NOT NULL, last_name varchar(20) NOT NULL);

然后是一个名为'技能'的表:

CREATE TABLE skill (skill_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, skill_name varchar(10) NOT NULL UNIQUE);

最后一张名为'students_skill'的表格:

CREATE TABLE students_skill (students_skill_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, student int NOT NULL, skill int NOT NULL);

最后一张桌子将为学生存储他们技能的组合,这种关系是一对多的。表student上的列skillstudent_skill是外键。

然后我们将索引添加到我们的外键:

ALTER TABLE `students_skill` ADD INDEX( `student`, `skill`);

我们还会为UNIQUEstudent添加skill值,以避免在输入具有相同技能的同一学生时出现重复问题:

ALTER TABLE `students_skill` ADD UNIQUE( `student`, `skill`);

最后,添加外键约束:

ALTER TABLE students_skill ADD CONSTRAINT fk_student FOREIGN KEY (student) references student (student_id);
ALTER TABLE students_skill ADD CONSTRAINT fk_skill FOREIGN KEY (skill) references skill (skill_id);

现在,我们假设我们在桌子上有这个值:

Table student (student_id = first_name, last_name)
1 = Kiel, Labuca
2 = Labuca, Kiel

Table skill (skill_id = skill_name)
1 = php
2 = css
3 = html
4 = c

Table students_skill (student_skill_id = student / skill)
1 = 1 / 2 (Kiel, Labuca / css)
2 = 1 / 3 (Kiel, Labuca / html)
3 = 2 / 1 (Labuca, Kiel / php)
4 = 2 / 4 (Labuca, Kiel / c)

现在,如果我们想要选择具有C编程语言的技能的学生,这是我们的查询:

SELECT CONCAT(student.last_name, ', ', student.first_name) AS 'name' FROM student, skill, students_skill WHERE student.student_id = students_skill.student AND skill.skill_id = students_skill.skill AND skill.skill_name = 'C';

上述查询只会输出学生Labuca, Kiel,因为他是student唯一具有技能C的人。

如果您想使用HTML在表格中显示,请输入以下代码:

<?php
    $resultSet = mysql_query("SELECT CONCAT(student.last_name, ', ', student.first_name) AS 'name' FROM student, skill, students_skill WHERE student.student_id = students_skill.student AND skill.skill_id = students_skill.skill AND skill.skill_name = 'C'");
?>

<table>
    <thead>
        <th>Student Name</th>
    </thead>
    <tbody>
        <?php while($result = mysql_fetch_assoc($resultSet)){ ?>
        <tr>
            <td><?php echo $result['name']; ?></td>
        </tr>
        <?php } ?>
    </tbody>
</table>

尝试尝试不同的查询条件变体。您想要的输出取决于您的查询条件。祝你好运,编码愉快。