PHP,PDO,无法让我的 BETWEEN 参数注册或准备,得到 0 行


PHP, PDO, Can't get my BETWEEN parameters to register or prepare, get 0 rows

我有一个项目,我正在将旧的MySQL东西转换为PDO。我已经 7 年多没有写过一行 PHP,但在过去的 2 周里,我在升级这个项目方面做得很好,仍然对 PHP 和 MySQL 中的一些东西生疏。

的问题或问题是我无法获得参数:startLetter和:stopLetter在PDO中注册或准备。:p artnerID工作正常。

如果我将其硬编码为测试,则在'''0'''和'''Z'之间,它可以正常工作。我确实对下面数组中的值进行了硬编码作为测试,并且我也测试了变量。我做了一个搜索,每个人在下面都有几乎相同的东西。

我被难住了!

$lc_query = 
'SELECT DISTINCT m.image_file, m.manufacturer' .
' FROM product p' .
' INNER JOIN manufacturer m' .
' ON p.mfg_id = m.mfg_id' .
' INNER JOIN products pp' .
' ON p.prod_id = pp.prod_id' .
' WHERE m.manufacturer BETWEEN ''0'' AND ''Z'' ' .
//' WHERE m.manufacturer BETWEEN :startLetter AND :stopLetter ' .
' AND pp.p_id = :partnerID' .
' AND p.avail_type < 3' .
' ORDER BY m.manufacturer';    
$lc_params = array(
    //':startLetter' => $lc_alphastart . ', PDO::PARAM_STR',
    //':stopLetter' =>  $lc_alphaend . ', PDO::PARAM_STR',
    ':partnerID' => $go_sitedict['partner_id'] . ', PDO::PARAM_INT'
);

我认为在PDOStatement->execute期间使用数组绑定时无法指定参数类型。所有参数都被视为字符串。实质上,您将绑定完整的字符串0, PDO::PARAM_STR作为开始字母,而停止字母也是如此。您可以使用PDOStatement->bindParam绑定单个值并指定值类型,或者在将数组传递给->execute时让PDO将其视为字符串(这通常很好,因为几乎每种类型都可以隐式转换为字符串,这意味着'0'==0,即使在sql中也是如此)。

所以它变成了:

$lc_query = 
'SELECT DISTINCT m.image_file, m.manufacturer' .
' FROM product p' .
' INNER JOIN manufacturer m' .
' ON p.mfg_id = m.mfg_id' .
' INNER JOIN products pp' .
' ON p.prod_id = pp.prod_id' .
//' WHERE m.manufacturer BETWEEN ''0'' AND ''Z'' ' .
' WHERE m.manufacturer BETWEEN :startLetter AND :stopLetter ' .
' AND pp.p_id = :partnerID' .
' AND p.avail_type < 3' .
' ORDER BY m.manufacturer';    
$lc_params = array(
    ':startLetter' => $lc_alphastart,
    ':stopLetter' =>  $lc_alphaend,
    ':partnerID' => $go_sitedict['partner_id']
);
//and to execute query...
$stmt=$DB_Connection->prepare($lc_sql);
$stmt->execute($lc_params);