我正在尝试学习如何根据用户选择填充数据的表单字段动态生成mysql查询。为了使学习过程尽可能简单,我使用了一个简单的表单,其中包含用户名和姓的字段。代码的基本(非动态)版本如下:
<html>
<head>
<title>Untitled</title>
</head>
<body>
<form method="post" name="test" action="dynamic_search.php">
<input type="text" name="first_name">
<input type="text" name="last_name">
<input type="submit" value="Submit">
</form>
<?php
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
include "link.php";
$query = "SELECT * FROM members " .
"WHERE first_name = '$first_name' " .
"AND last_name = '$last_name' ";
$result = mysql_query($query)
or die(mysql_error());
$row = mysql_fetch_array($result);
$member_id = $row['member_id'];
$member_first_name = $row['first_name'];
$member_last_name = $row['last_name'];
echo $member_id;
echo $member_first_name;
echo $member_last_name;
?>
</body>
</html>
我需要做的是根据提交的数据生成查询。因此,如果用户只输入他们的名字,则查询将显示为:
$query = "SELECT * FROM members " .
"WHERE first_name = '$first_name' ";
但是如果用户同时输入他们的名字和姓氏,则查询将显示为:
$query = "SELECT * FROM members " .
"WHERE first_name = '$first_name' " .
"AND last_name = '$last_name' ";
任何帮助(或者如果有人能指出我指向一个好的教程)将不胜感激!
谢谢!
答案 0 :(得分:1)
您可以使用PHP检查输入并在必要时附加到查询。
$query = "SELECT * FROM members ";
$query .= "WHERE first_name = '$first_name' ";
if($last_name!="")
$query .="AND last_name = '$last_name' ";
请记住使用real_escape_string
来转义字符串$first_name = mysql_real_escape_string($_POST['first_name']);
如果您想检查名字:
$query = "SELECT * FROM members ";
if($first_name!=""){
$query .= "WHERE first_name = '$first_name' ";
if($last_name!="")
$query .="AND last_name = '$last_name' ";
}
else{
if($last_name!="")
$query .="WHERE last_name = '$last_name' ";
}
答案 1 :(得分:1)
首先,don't use mysql_*
functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDO或MySQLi - this article将帮助您确定哪个。如果您选择PDO,here is a good tutorial。 (Credit)
第二,caution to always escape user input being included in an SQL statement。准备好的语句会自动为您处理。
话虽如此,你所追求的PHP逻辑是这样的:
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$first_name = $mysqli->real_escape_string($_POST['first_name']);
$last_name = $mysqli->real_escape_string($_POST['last_name']);
$sql = "SELECT * FROM members WHERE 1";
if (! empty($first_name)) {
$sql .= " AND first_name = '$first_name'";
}
if (! empty($last_name)) {
$sql .= " AND last_name = '$last_name'";
}
答案 2 :(得分:0)
因此,如果您想基于表单条目生成MySQL查询,则可以在下面查看此函数生成器:
https://github.com/nilportugues/php-sql-query-builder
这使您可以获取表单结果及其字段名称(或ID),并将其编码到查询生成器中,以生成所需的查询!
一点建议是确保字段名称与表列名称匹配。这将使您的过程更加无缝。
例如。在您的情况下(假设您的列名与表单名匹配,并且表被命名为“成员”):
git merge-file -p --diff3 ours base theirs
这将输出:
<?php
use NilPortugues\Sql\QueryBuilder\Builder\GenericBuilder;
$builder = new MySqlBuilder(); // <-- use MySqlBuilder
$query = $builder->select()
->setTable('members')
->setColumns(['first_name','last_name','email']); // <-- Form names
echo $builder->write($query);
?>
哇!
您可以在开发人员的GitHub页面上生成许多复杂的查询。