2

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

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

如果我将它硬编码为测试,在 \'0\' AND \'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'
);
4

1 回答 1

3

我不认为你可以在使用数组绑定时指定参数类型PDOStatement->execute。所有参数都被认为是字符串。您基本上会将完整的字符串绑定0, PDO::PARAM_STR为起始字母,并与终止字母相同。您可以使用PDOStatement->bindParam绑定单个值并指定值类型,也可以在将数组传递给时让 PDO 将其视为字符串->execute(这通常很好,因为几乎每种类型都可以隐式转换为字符串,这意味着'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);
于 2013-10-29T23:54:03.507 回答