Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅提交部分有效的mysqli查询_Php_Mysql - Fatal编程技术网

Php 仅提交部分有效的mysqli查询

Php 仅提交部分有效的mysqli查询,php,mysql,Php,Mysql,我试图在PHP中找到一种方法,将多个下拉框中的数据组合成一条SQL语句。我可以让这部分工作。以下是SQL查询: $sql = " SELECT * FROM books WHERE author = '$bird' AND genre = '$cat' AND year= '$mouse' AND publisher = '$goat' "; $bird,$cat等是保存每个下拉框中的选择的变量。 我得到的结果好坏参半所有四个都可以很好地协同工作,并

我试图在PHP中找到一种方法,将多个下拉框中的数据组合成一条SQL语句。我可以让这部分工作。以下是SQL查询:

$sql = "
  SELECT *
  FROM books
  WHERE
    author = '$bird'
    AND genre = '$cat'
    AND year= '$mouse'
    AND publisher = '$goat'
";
$bird
$cat
等是保存每个下拉框中的选择的变量。 我得到的结果好坏参半所有四个都可以很好地协同工作,并且都可以单独工作

所以,如果我从作者、流派、年份和出版商中选择,然后按select it works,如果我分别选择这些,它们也可以工作

但是如果尝试只选择两个项目,比如作者和年份,它不起作用,并且可能产生各种不正确的数据。这是完整的代码。感谢您的帮助:

<html>
    <head>
        <title>My Page</title>
    </head>
    <body>
        <br>
        <form name="myform" action="authors3.php" method="POST">
            <select name="author" size="2">
            <option value="ken davies">ken davies</option>
            <option value= "arthur smith">arthur smith</option>
            <option value="gill rafferty">gill rafferty</option><br />
            <option value="molly brown">molly brown</option><br />
            <option value="gilbert riley">gilbert riley</option><br />
            <input type = "submit" name = "submit" value = "go">

            <select name="genre" size="4">
            <option value="adventure">adventure</option>
            <option value="biography">biography</option>
            <option value="crime">crime</option><br />
            <option value="romance">romance</option>
            <option value="thriller">thriller</option>
            <input type = "submit" name = "submit" value = "go">

            <select name="year" size="4">
            <option value="2002">2002</option>
            <option value="2003">2003</option>
            <option value="2004">2004</option>
            <option value="2005">2005</option>
            <option value="2006">2006</option>
            <option value="2007">2007</option>
            <option value="2008">2008</option>
            <input type = "submit" name = "submit" value = "go">

            <select name="publisher" size="4">
            <option value="blue parrot">blue parrot</option>
            <option value="yonkers">yonkers</option>
            <option value="zoot">zoot</option>
            <input type = "submit" name = "submit" value = "go">

                <?php
                    $bird = (!empty($_POST['author'])) ? $_POST['author'] : null;
                    $cat = (!empty($_POST['genre'])) ? $_POST['genre'] : null;
                    $mouse = (!empty($_POST['year'])) ? $_POST['year'] : null;
                    $goat = (!empty($_POST['publisher'])) ? $_POST['publisher'] : null;

                    $con = mysql_connect("localhost","root","");
                    If (!$con) {
                        die("Can not Connect with database" .  mysql_error());
                    }
                    mysql_select_db("authors",$con);


                    if (isset($bird) && isset($cat) && isset($mouse) && isset($goat)){  
                        $sql = "SELECT * FROM books WHERE author = '$bird'
                                AND genre = '$cat' AND year = '$mouse' AND
                                publisher = '$goat' ";
                    }
                    else if (isset($bird)) { 
                        $sql = "SELECT * FROM books WHERE author = '$bird' ";
                    }
                    else if (isset($cat)) {
                        $sql = "SELECT * FROM books WHERE genre = '$cat' ";
                    }
                    else if (isset($mouse)) {   
                        $sql = "SELECT * FROM books WHERE year = '$mouse' ";    
                    }       
                    else if (isset($goat)) {
                        $sql = "SELECT * FROM books WHERE publisher = '$goat' ";    
                    }   

                    $myData = mysql_query($sql,$con);

                    echo"<table border=1>

                    <tr>
                        <th>id</th>
                        <th>author</th>
                        <th>title</th>
                        <th>publisher</th>
                        <th>year</th>
                        <th>genre</th>
                        <th>sold</th>
                    </tr>";

                    while($record = mysql_fetch_array($myData)){
                        echo "<tr>";
                        echo "<td>" . $record['id'] . "</td>";
                        echo "<td>" . $record['author'] . "</td>";
                        echo "<td>" . $record['title'] . "</td>";
                        echo "<td>" . $record['publisher'] . "</td>";
                        echo "<td>" . $record['year'] . "</td>";
                        echo "<td>" . $record['genre'] . "</td>";
                        echo "<td>" . $record['sold'] . "</td>";
                        echo "<tr />";
                    }
                    echo "</table>";

                    mysql_close($con);
                ?>
                note: all four are working<br />
                all work individually<br />
                two or three dont work together
        </form>
    </body>
</html>

我的页面

肯·戴维斯 亚瑟·史密斯 吉尔·拉弗蒂
莫莉·布朗
吉尔伯特·莱利
冒险 传记 犯罪
浪漫 惊悚片 2002 2003 2004 2005 2006 2007 2008 蓝色鹦鹉 扬克斯 佐特 注意:所有四个都在工作
所有人都单独工作
两个或三个不能一起工作
除了使用一种不推荐的方式连接MySQL(请阅读SQL注入和PDO),您的代码中没有涵盖所有用例


更好的方法可能是编写一个基本查询(
$q='SELECT*FROM books WHERE
),并在检查参数是否为空(
if(!empty($goat))//将新子句追加到WHERE部分的基础上,使用适当的额外WHERE子句扩展该查询。

您的查询可以做到一半。您的声明是您的问题的原因!原因是你基本上是这样做的:

genre ='adventure' and year = null. 
您要做的是相应地编辑查询。那么你会想做什么

if (!is_null($year)) {

     $sql.= "AND Year = $year";

}
问题是上述方法允许注射!!如果你对此感到厌烦,这是一个大问题


因此,我建议使用bind_参数,但是,在bind_参数上调用cal_user_func_数组有点棘手,因此我建议使用PDO,在PDO中,您可以安全有效地编辑查询并管理参数

如果不需要where子句,则需要将其每个部分设置为有条件的。现在,如果他们不选择流派,例如,你的选择类似于
WHERE author='x'和genre=''(或者什么都没有?)和…
你需要的地方我猜
WHERE author='x'和year…
。根据您的需要,如果未选择组合,则需要填写通配符以使其
和genre='%'…
允许任何类型。检查此项: