【问题标题】:How to query with multiple arrays in PHP如何在 PHP 中查询多个数组
【发布时间】:2018-03-15 12:19:08
【问题描述】:

我正在尝试创建一个表单,用户可以在其中使用多个过滤器搜索数据库。我有两个问题:如何使用多个数组查询数据库,因为每个过滤器将作为结果页面上的数组存储在一个变量中。第二个是:我如何确保如果用户将过滤器留空,则过滤器不会进入查询?也不需要用户在前两个文本条目中输入任何内容。谢谢。

<form action="results.php" method="post">
			<table id="name-inputs">
				<tr>
					<td>Common Name:</td>
					<td><input type="text" name="commonName" class="text-input" maxlength="100"></td>
				</tr>
				<tr>
					<td>Latin Name:</td>
					<td><input type="text" name="latinName" class="text-input"  maxlength="100"></td>
				</tr>
			</table>
			<div id="plantType-container">
				<ul>
					<li class="listing-heading">Plant Type</li>
					<li class="listing"><input type="checkbox" name="plantType[]" value="Perennial"> Perennial</li>
					<li class="listing"><input type="checkbox" name="plantType[]" value="Annual"> Annual</li>
					<li class="listing"><input type="checkbox" name="plantType[]" value="Tree"> Tree</li>
					<li class="listing"><input type="checkbox" name="plantType[]" value="Shrub"> Shrub</li>
					<li class="listing"><input type="checkbox" name="plantType[]" value="Herb"> Herb</li>
				</ul>
			</div>
			<div id="lighting-container">
				<ul>
					<li class="listing-heading">Lighting</li>
					<li class="listing"><input type="checkbox" name="lighting[]" value="Sun"> Sun</li>
					<li class="listing"><input type="checkbox" name="lighting[]" value="Sun/Part-Sun"> Sun/Part-Sun</li>
					<li class="listing"><input type="checkbox" name="lighting[]" value="Part-Sun/Shade"> Part-Sun/Shade</li>
					<li class="listing"><input type="checkbox" name="lighting[]" value="Shade"> Shade</li>
				</ul>
			</div>
			<div id="water-container">
				<ul>
					<li class="listing-heading">Water</li>
					<li class="listing"><input type="checkbox" name="water[]" value="Average"> Dry</li>
					<li class="listing"><input type="checkbox" name="water[]" value="Dry/Average"> Dry/Average</li>
					<li class="listing"><input type="checkbox" name="water[]" value="Average"> Average</li>
					<li class="listing"><input type="checkbox" name="water[]" value="Wet/Average"> Wet/Average</li>
					<li class="listing"><input type="checkbox" name="water[]" value="Wet"> Wet</li>
				</ul>
			</div>
			<div id="foilage-container">
				<ul>
					<li class="listing-heading">Foilage</li>
					<li class="listing"><input type="checkbox" name="foilage[]" value="Decidous"> Decidous</li>
					<li class="listing"><input type="checkbox" name="foilage[]" value="Evergreen"> Evergreen</li>
				</ul>
				<ul>
					<li class="listing-heading">Deer Resistant</li>
					<li class="listing"><input type="checkbox" name="deer-res[]" value="Yes"> Yes</li>
					<li class="listing"><input type="checkbox" name="deer-res[]" value="No"> No</li>
				</ul>
			</div>
			<div id="attracts-container">
				<ul>
					<li class="listing-heading">Attracts</li>
					<li class="listing"><input type="checkbox" name="butter/birds[]" value="Butterflies"> Butterflies</li>
					<li class="listing"><input type="checkbox" name="butter/birds[]" value="Hummingbirds"> Hummingbirds</li>
					<li class="listing"><input type="checkbox" name="butter/birds[]" value="Butterflies/Hummingbirds"> Butterflies/Hummingbirds</li>
				</ul>
			</div>
			<div id="height-container">
				<ul>
					<li class="listing-heading">Height</li>
					<li class="listing"><input type="checkbox" name="height[]" value='1-2"'> 1-2"</li>
					<li class="listing"><input type="checkbox" name="height[]" value='3-5"'> 3-5"</li>
					<li class="listing"><input type="checkbox" name="height[]" value='5-10"'> 5-10"</li>
					<li class="listing"><input type="checkbox" name="height[]" value='10-20"'> 10-20"</li>
					<li class="listing"><input type="checkbox" name="height[]" value="20'"> 20' +</li>
				</ul>
			</div>
			<div id="color-container">
				<ul>
					<li class="listing-heading">Flower Color</li>
					<li class="listing"><input type="checkbox" name="color[]" value="White"> White</li>
					<li class="listing"><input type="checkbox" name="color[]" value="Pink"> Pink</li>
					<li class="listing"><input type="checkbox" name="color[]" value="Red"> Red</li>
					<li class="listing"><input type="checkbox" name="color[]" value="Blue"> Blue</li>
					<li class="listing"><input type="checkbox" name="color[]" value="Orange"> Orange</li>
					<li class="listing"><input type="checkbox" name="color[]" value="Yellow"> Yellow</li>
					<li class="listing"><input type="checkbox" name="color[]" value="Purple"> Purple</li>
				</ul>
			</div>
			<button type="submit" id="sButton">Submit</button>
		</form>

<?php
	$commonName = $_POST['commonName'];
	$latinName = $_POST['latinName'];
	$plantType = $_POST['plantType'];
	$lighting = $_POST['lighting'];
	$water = $_POST['water'];
	$foilage = $_POST['foilage'];
	$attracts = $_POST['attracts'];
	$height = $_POST['height'];
	$color = $_POST['color'];
?>

<?php
		$con = new mysqli("localhost", "root", "root", "Plants");
		if($con->connect_error()) {
			echo "Connection Error: " . $con->connect_error();
		} else {
			$sql = "SELECT * FROM plants where plantType like '%$plantType%' AND lighting like '%$lighting%' AND water like '%$water%' AND foilage like '%$foilage%' AND attracts like '%$attracts%' AND height like '%$height%' AND color like '%$color%'";
			$res=$con->query($sql);

			echo "<table id='result-table'>";
			while ($res = $con->fetch_assoc()) {
				echo "<tr>";
				echo "<td>" . $row['commonName'] . "</td>";
				echo "<td>" . $row['latinName'] . "</td>";
				echo "<td>" . $row['plantType'] . "</td>";
				echo "<td>" . $row['lighting'] . "</td>";
				echo "<td>" . $row['water'] . "</td>";
				echo "<td>" . $row['foilage'] . "</td>";
				echo "<td>" . $row['attracts'] . "</td>";
				echo "<td>" . $row['height'] . "</td>";
				echo "<td>" . $row['color'] . "</td>";
				echo "</tr>";
			}
			echo "</table>";
		}
	?>

【问题讨论】:

  • 你知道你应该接受答案吗?

标签: php sql database filter


【解决方案1】:

试试我下面的代码

<?php

$commonName = $_POST['commonName'];
$latinName = $_POST['latinName'];

$queryStr = '';
if(isset($_POST['plantType'])){
    $plantType = implode("','",$_POST['plantType']);
    $queryStr .= " AND plantType IN ('".$plantType."') ";
}
if(isset($_POST['lighting'])){
    $lighting = implode("','",$_POST['lighting']);
    $queryStr .= " AND lighting IN ('".$lighting."') ";
}

if(isset($_POST['water'])){
    $water = implode("','",$_POST['water']);
    $queryStr .= " AND water IN ('".$water."') ";
}

if(isset($_POST['foilage'])){
    $foilage = implode("','",$_POST['foilage']);
    $queryStr .= " AND foilage IN ('".$foilage."') ";
}

if(isset($_POST['attracts'])){
    $attracts = implode("','",$_POST['attracts']);
    $queryStr .= " AND attracts IN ('".$attracts."') ";
}

if(isset($_POST['height'])){
    $height = implode("','",$_POST['height']);
    $queryStr .= " AND height IN ('".$height."') ";
}

if(isset($_POST['color'])){
    $color = implode("','",$_POST['color']);
    $queryStr .= " AND color IN ('".$color."') ";
}

$con = new mysqli("localhost", "root", "root", "Plants");
if($con->connect_error()) {
    echo "Connection Error: " . $con->connect_error();
} else {
    $sql = "SELECT * FROM plants where 1=1 '$queryStr'";
    $res=$con->query($sql);

    echo "<table id='result-table'>";
    while ($res = $con->fetch_assoc()) {
        echo "<tr>";
        echo "<td>" . $row['commonName'] . "</td>";
        echo "<td>" . $row['latinName'] . "</td>";
        echo "<td>" . $row['plantType'] . "</td>";
        echo "<td>" . $row['lighting'] . "</td>";
        echo "<td>" . $row['water'] . "</td>";
        echo "<td>" . $row['foilage'] . "</td>";
        echo "<td>" . $row['attracts'] . "</td>";
        echo "<td>" . $row['height'] . "</td>";
        echo "<td>" . $row['color'] . "</td>";
        echo "</tr>";
    }
    echo "</table>";
}?>

【讨论】:

    【解决方案2】:

    试试我下面的代码。

    <?php
    
    $commonName = $_POST['commonName'];
    $latinName = $_POST['latinName'];
    
    $queryStr = '';
    if(isset($_POST['plantType'])){
        $plantType = $_POST['plantType'];
        $queryStr .= " AND plantType like '%$plantType%'";
    }
    if(isset($_POST['lighting'])){
        $lighting = $_POST['lighting'];
        $queryStr .= " AND lighting like '%$lighting%'";
    }
    
    if(isset($_POST['water'])){
        $water = $_POST['water'];
        $queryStr .= " AND water like '%$water%'";
    }
    
    if(isset($_POST['foilage'])){
        $foilage = $_POST['foilage'];
        $queryStr .= " AND foilage like '%$foilage%'";
    }
    
    if(isset($_POST['attracts'])){
        $attracts = $_POST['attracts'];
        $queryStr .= " AND attracts like '%$attracts%'";
    }
    
    if(isset($_POST['height'])){
        $height = $_POST['height'];
        $queryStr .= " AND height like '%$height%'";
    }
    
    if(isset($_POST['color'])){
        $color = $_POST['color'];
        $queryStr .= " AND color like '%$color%'";
    }
    
    $con = new mysqli("localhost", "root", "root", "Plants");
    if($con->connect_error()) {
        echo "Connection Error: " . $con->connect_error();
    } else {
        $sql = "SELECT * FROM plants where 1=1 '$queryStr'";
        $res=$con->query($sql);
    
        echo "<table id='result-table'>";
        while ($res = $con->fetch_assoc()) {
            echo "<tr>";
            echo "<td>" . $row['commonName'] . "</td>";
            echo "<td>" . $row['latinName'] . "</td>";
            echo "<td>" . $row['plantType'] . "</td>";
            echo "<td>" . $row['lighting'] . "</td>";
            echo "<td>" . $row['water'] . "</td>";
            echo "<td>" . $row['foilage'] . "</td>";
            echo "<td>" . $row['attracts'] . "</td>";
            echo "<td>" . $row['height'] . "</td>";
            echo "<td>" . $row['color'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
    }
    

    ?>

    【讨论】:

    • $_POST['plantType'] 和 $_POST 中的每个其他条目都是一个数组,这不起作用。
    • 让 rstone14 被指定,因为如果它是数组,那么他/她从未在查询中使用 Like。我 100% 确定 $_POST['plantType'] 不是数组。
    • 不,这是一个数组,'因为如果表单中的名称看起来像这样-plantType[],则表示它有多个值,这是一个数组。在这种情况下,$_POST 的片段将如下所示:Array ([0] =&gt; Perennial [1] =&gt; Tree)
    • 为了在查询中使用数组值,应该以这样的方式转换function makeSubQuery ($array, $keyword) { $subQuery = ''; if (sizeof($array) &gt; 0) { foreach ($array as $key =&gt; $value) { $subQuery .= " AND $keyword like '%$value' ") } } return $subQuery; }
    • 查看我的另一个数组类型的答案。对于数组,我们可以使用 In 运算符。
    猜你喜欢
    • 2017-04-30
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多