PHP PDO:无效的参数编号:绑定变量的数量与令牌的数量不匹配

问题描述:

我不知道我在这里做错了什么?有人可以帮帮我吗?当执行以下查询我收到以下错误:PHP PDO:无效的参数编号:绑定变量的数量与令牌的数量不匹配

警告:PDOStatement对象::执行()[pdostatement.execute]:SQLSTATE [HY093]:无效参数号:绑定变量的数目不匹配的令牌

的数
// Required files 
include("../../includes/common.inc.php"); 
require_once("../../includes/config.php"); 

session_start(); 

$man_email = $_SESSION['dStation']->getValue('email'); 
//echo $man_email; 
/* Connection vars here for example only. Consider a more secure method. */ 
$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = ''; 
$dbname = 'dstation_db'; 

try { 
    // Connect and create the PDO object 
    $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

$return_arr = array(); 

if ($conn) 
{ 
$ac_term = "%wa%"; 
//$ac_term = "%".$_GET['term']."%"; 
$query = "SELECT * FROM ds_employee AS e 
      LEFT OUTER JOIN ds_employee_address AS a ON e.id_employee = a.fk_employee 
      LEFT OUTER JOIN ds_employee_detail AS d ON e.id_employee = d.fk_employee 
      LEFT OUTER JOIN ds_department AS g ON d.fk_department = g.id_department 
      LEFT OUTER JOIN ds_job_title AS j ON d.job_title = j.id_job_title 
      LEFT OUTER JOIN ds_manager AS m ON d.fk_manager = m.id_manager 
      WHERE emp_lastname LIKE :term AND man_email = :man_email"; 
    echo $query; 

$result = $conn->prepare($query); 
$result->bindValue(":term", $ac_term, PDO::PARAM_STR); 
$result->bindValue(":man_email", $man_email, PDO::PARAM_STR); 
$result->execute(); 

/* Retrieve and store in array the results of the query.*/ 
while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
    $row_array['id_employee'] = $row['id_employee']; 
    $row_array['value'] = $row['emp_lastname'] . ', ' . $row['emp_firstname'] . ' - ' . $row['description']; 
    $row_array['lastname'] = $row['emp_lastname']; 
    $row_array['abbrev'] = $row['emp_firstname']; 
    $row_array['job_title'] = $row['description']; 
    $row_array['fk_department'] = $row['dept_name']; 
    $row_array['fk_manager'] = $row['fk_manager']; 


    array_push($return_arr,$row_array); 
} 

} 
/* Free connection resources. */ 
    $conn = null; 
    /* Toss back results as json encoded array. */ 
    echo json_encode($return_arr); 

我根据收到的答案纠正了错误。这纠正了错误消息,但查询仍然不起作用。当我赞同查询,这是获取返回的内容:

SELECT * FROM ds_employee为e LEFT OUTER JOIN ds_employee_address AS一个ON e.id_employee = a.fk_employee LEFT OUTER JOIN ds_employee_detail为d ON e.id_employee = LEFT d.fk_employee OUTER JOIN ds_department AS g ON d.fk_department = g.id_department LEFT OUTER JOIN ds_job_title AS j ON d.job_title = j.id_job_title LEFT OUTER JOIN ds_manager AS m ON d.fk_manager = m.id_manager WHERE emp_lastname LIKE:term AND man_email =: man_email []

我不明白括号是从哪里来的:man_email?

+1

查询中的'man_email'之前缺少':' – 2013-02-17 04:06:39

+0

@REF您正在执行的行是'echo $ query;'将其更改为'echo $ query'。 '###';'如果括号出现在'###'之前,那么它们是查询字符串的一部分,如果它们在它后面,那么它们将在稍后输出到脚本中。将结果报告回来,以便我们确定它是哪个,然后从那里继续。 – 2013-02-17 09:34:46

+0

现在我很困惑。方括号出现在#### – REF 2013-02-17 13:21:32

WHERE emp_lastname LIKE :term AND man_email = '[email protected]'"; 

应该是:

WHERE emp_lastname LIKE :term AND man_email = :man_email"; 

如果你想直接在查询测试电子邮件,你应该暂时注释掉该行:

$result->bindValue(":man_email", $man_email, PDO::PARAM_STR); 

既然你直接在推杆电子邮件地址而不是使用:token_name您的第二参数绑定失效。如果您将它评论出来,您可以直接输入测试邮件。然而更简单的方法是这样做:

$man_email = '[email protected]'; 

在绑定参数之前创建测试值。这样你就可以保持查询完整无损并且不必评论任何事情。完成测试后,请删除此行。