PHP формы, отправка только выбранных данных - PullRequest
0 голосов
/ 14 марта 2012
  • У меня есть эта база растений
  • HTML-форма, которая отправляет данные, которые пользователь вводит в php-файл
  • php файл, который выполняет sql, который будет перечислять растения из базы данных на основе пользовательского ввода

так, например, они могут выбрать растения типа «дерево». они могли бы также ввести английское имя для конкретного поиска, теперь это мой php:

$data = mysql_query("SELECT * FROM Plants WHERE PlantType='$plantType' AND EnglishName='$englishName'") 

но как я могу это сделать, поэтому, если пользователь не вводит английское имя для поиска, он будет искать ТОЛЬКО по типу установки? Примечание: у меня будет много полей для поиска, таких как цвет цветка, тип почвы и т. Д., И я хочу искать только по тем, которые пользователи выбирают для изменения.

Ответы [ 5 ]

2 голосов
/ 14 марта 2012

Создайте строку запроса перед запуском запроса:

$fields = array();
if ($plantType != "") {
    $fields["PlantType"] = $plantType;
}
if ($englishName != "") {
    $fields["EnglishName"] = $englishName;
}
if (count($fields) < 1) {
    echo "No fields submitted";
} else {
    $query = "SELECT * FROM Plants WHERE ";
    foreach($fields as $field => $value) {
        $query .= $field." = '".$value."' AND ";
    }
    $query = substr($query,0,-4);
    $data = mysql_query($query);
}
1 голос
/ 14 марта 2012
$query = "SELECT * FROM Plants WHERE PlantType='$plantType'";
if(isset($_POST['englishName'])) $query .= " AND EnglishName='$englishName'";
if(isset($_POST['someForm']))    $query .= " AND someForm='$otherForm'";
if(isset($_POST['otherForm']))   $query .= " AND otherForm='$otherForm'";

$data = mysql_query($query);

Вы также можете подготовить весь оператор, а если переменная пуста, использовать подстановочный знак (%).

if(isset($_POST['something']) { 
 $something = mysql_real_escape_string($_POST['something'];)
}else{ 
 $something = '%'; 
}

Вы, очевидно, захотите проверить ваши POST-переменные на наличие неверных данных, иначе вы откроете себя для атаки SQL-инъекцией. Кроме того, это намного легче сделать с подготовленными заявлениями PDO. Я бы прочитал на PDO @ PHP.net

0 голосов
/ 14 марта 2012

Существует множество продвинутых методов, позволяющих справиться с этим только в MySQL. Например, оператор «ИЛИ» после любого предложения «Где» или даже слияние.

С учетом вышесказанного я бы динамически создал ваше предложение WHERE (PS не для обеспечения безопасности!)

<?php
    $sql = "SELECT * FROM Plants WHERE";

    $where = array();

    if(!empty($_GET['plantType'])){
        'PlantType=' . mysql_real_escape_string($_GET['plantType']);
    }

    if(!empty($_GET['EnglishName'])) {
        'EnglishName=' . mysql_real_escape_string($_GET['EnglishName']);
    }

    if(!empty($_GET['color'])) {
        'color=' . mysql_real_escape_string($_GET['color']);
    }

    if(!empty($_GET['soilType'])) {
        'soilType=' . mysql_real_escape_string($_GET['soilType']);
    };

    foreach($where as $key => $value) {
        $sql = $sql . ' ' . $value;
        if($key+1 < count($where)) {
            $sql = $sql . ' AND'
        }
    }

    $data = mysql_query($sql);
?>
0 голосов
/ 14 марта 2012

на основе пользовательского ввода вы можете построить запрос.

    $query_string =  "SELECT * FROM Plants WHERE PlantType='$plantType'";
    if(!empty($_POST["engName"]))
       $query_string .= "AND EnglishName=".$_POST['engName'];

Конечно, очистите $ _POST ["engName"] !!

0 голосов
/ 14 марта 2012

Сохраните все условия, которые пользователь хочет выполнить, и array и implode их в строку для вашего запроса:

$conditions = array();

if (isset($_POST['plantType']) && is_string($_POST['plantType']))
    $conditions[] = "PlantType = '".mysql_real_escape_string($_POST['plantType'])."'";

if (isset($_POST['englishName']) && is_string($_POST['englishName']))
    $conditions[] = "EnglishName = '".mysql_real_escape_string($_POST['englishName'])."'";

// repeat for color, soilType, ... 

$query = "SELECT * FROM Plants";
if (count($conditions) > 0)
    $query .= " WHERE ".implode(" AND ", $conditions);

$data = mysql_query($query);

Более короткая версия, которая делает то же самое:

$conditions = array();
$validColumns = array(
    // Name of the column in DB => name of the parameter in URL
    "PlantType"                 => "plantType",
    "EnglishName"               => "englishName",
    "Color"                     => "color",
    // add more here
);

// Loop through all valid columns the user might input.
foreach ($validColumns as $column => $param)
{
    // If it is set and maybe if it is valid (add validation here).
    // add this condition to our array
    if (isset($_POST[$param]) && is_string($_POST[$param]) && !empty($_POST[$param]))
         $conditions[] = "`$column` = '" . 
             // Don't forget to escape to prevent SQL-Injection.
             mysql_real_escape_string($_POST[$param])."'"; 
}

$query = "SELECT * FROM Plants";

// Check if there are any conditions. Otherwise display all plants.
if (count($conditions) > 0)
    $query .= " WHERE ".implode(" AND ", $conditions);

$data = mysql_query($query);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...