2013-06-27 7 views
0

Я пытаюсь научиться динамически генерировать запрос mysql на основе полей формы, которые пользователь выбирает для заполнения данными. Чтобы сделать процесс обучения максимально простым, я использую простую форму с полем для имени и фамилии пользователей. Основной (нединамическая) версия кода выглядит следующим образом:динамически генерировать запрос mysql с php

<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

Пожалуйста, прочитайте на [инъекции SQL] (http://en.wikipedia.org/wiki/SQL_injection) – Kibbee

ответ

0

Одним из вариантов является проверка пустым:

$query = "SELECT * FROM members " . 
    "WHERE ('$first_name' = '' OR first_name = '$first_name') " . 
    "AND ('$last_name' = '' OR last_name = '$last_name') "; 

Таким образом, это будет равно справедливо, если first_name является пустым, например (только убедитесь, что ваши скобки написаны соответственно).

+0

Это будет работать, только если запись в базе данных для первого или последнего имени пуста. Но спасибо –

+1

@matttuman - почему? Это должно работать, если $ first_name пустое - передаваемая переменная. – user2480596

+0

Если пользователь вводит имя Nick, но не вводит свою фамилию, в базе данных будут искать записи, содержащие имя Nick и фамилию empty. . В этом сценарии я хочу получить запрос, который будет искать только имена, которые равны Нику –

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' "; 
} 
+0

Удивительный! И я предполагаю, что могу просто продолжать добавлять утверждения для более сложных форм? –

+0

Да, вы можете просто иметь в виду санитарию ваших входов. –

+0

Хотя, если пользователь делает обратное и заполняет фамилию, оставив свое имя пустым, у меня будет такая же проблема. –

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)

Во-вторых, a 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'"; 
} 
+0

Большое спасибо! И я обязательно проверю ресурсы, которые вы предложили! –