如何使用PHP,AND& amp;从SQL db获取数据在特定情况下的BETWEEN条款

时间:2014-03-30 08:12:07

标签: php sql html-form

我正在为学校工作,我有一个html表单,一个php文件和一个SQL数据库。在html表单中,我有一个下拉列表,询问 zipcode ,一个要求姓氏的文本字段,以及另外两个要求范围的文本字段呼叫长度(一个用于最小值,一个用于最大值)。代码如下:

<form action="database.php">
<h3 class="prompt1"> Select Your Area Code </h3>
<select name="areaCode">
    <option value="111">111</option>
                       etc...
</select>

<h3 class="prompt1"> Enter Last Name </h3>
<input type="text" size="35" name="lastName">

<h3 class="prompt1"> Select Call Length Range </h3>
<input type="text" size="3" value="min" name="min">–
<input type="text" size="3" value="max" name="max">

    <input type="submit">
</form>

然后一个php文件从表单中读取数据,然后它在SQL数据库中查询满足表单中输入条件的行,然后它应该在表中打印出结果,但是我在哪里问题是在php文件的第14行。代码如下:

<?php 

require '../../connection.php'; /* connection to db is in another file*/

$min = $_GET['min'];
$max = $_GET['max'];

$sql = "SELECT * FROM project 
    WHERE (areaCode = :areaCode 
    AND lastName = :lastName 
    AND (callLength BETWEEN $min AND $max))";

$stmt = $dataconn -> prepare($sql); 
$stmt -> execute(array(":areaCode"=>$_GET['areaCode'])); /* line 14 */
$results = $stmt->fetchAll();

/* print out $results in a table down here /*

?>

我想在数据库中查询整个行,这些行包含区域代码,姓氏和调用html表单中的调用长度(在最小值和最大值内)。我没有得到SQL查询的错误,但是当我在第14行执行()时遇到错误。这里我是错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid         parameter number: number of bound variables does not match number of tokens' in /home/CLASSES/martinezgregoryl/public_html/cst336/assignments/assn6/database.php:14 Stack trace: #0 /home/CLASSES/martinezgregoryl/public_html/cst336/assignments/assn6/database.php(14): PDOStatement->execute(Array) #1 {main} thrown in /home/CLASSES/martinezgregoryl/public_html/cst336/assignments/assn6/database.php on line 14

有了执行声明,我被教导我应该(这是演讲摘录):

  
      
  1. 执行语句,从查询中替换id命名参数:   $ stmt - &gt; execute(array(':id'=&gt;'1'));
  2.   

因为我查询了isacode,lastName和一个min和max之间的callLength。我假设我需要在execute语句中包含这些参数,目前我在execute语句中只有areaCode,但如果我包含姓氏和callLength,我应该有类似的东西(我认为):

$stmt -> execute(array(":areaCode"=>$_GET['areaCode'], ":lastName"=>$_GET['lastName'], "callLength"=>...I don't know...));  

问题是,我不知道如何将callLength部分包含在execute语句中,因为它包含BETWEEN子句,我不能只放callLength"=>$_GET['callLength']。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你可以 构建一个嵌入了正确字符串的查询并进行直接查询而无需编写语句然后绑定参数,或者在execute()中使用替换(绑定)命令。当你混合两者时,它会更加混乱。你在这个孤立的情况下所做的事情并不重要,但如果你正确使用execute()那么你可以保持查询并使用不同的参数一遍又一遍地使用它,所以在某些代码中&#39; sa大获胜。但正如错误消息所述,如果使用替换,那么SQL语句中的标记或标记的数量必须与传递给execute()的数组中的参数数量相匹配。 两者的例子:     

$sql = "SELECT * FROM project 
    WHERE (areaCode = :areaCode 
    AND lastName = :lastName 
    AND (callLength BETWEEN :min AND :max))";

$stmt = $dataconn -> prepare($sql); 
$stmt -> execute(array(":areaCode"=>$_GET['areaCode'], ":lastName"=>$_GET['lastName'],
    ":min"=>$_GET['min'], ":max"=>$_GET['max']));
$results = $stmt->fetchAll();
/* print out $results in a table down here /*
?>

否则:

<?php 
require '../../connection.php'; /* connection to db is in another file*/
$min = $_GET['min'];
$max = $_GET['max'];
$areaCode = $_GET['areaCode'];
$lastName = $_GET['lastName'];

$sql = "SELECT * FROM project 
    WHERE (areaCode = $areaCode 
    AND lastName = $lastName 
    AND (callLength BETWEEN $min AND $max))";

$results = $dataconn -> query($sql);
/* print out $results in a table down here /*
?>