1

当我将代码中的字符串替换为与这些字符串等效的变量时,我的代码会生成一个致命错误。

我正在尝试生成具有宽阔和相反叶子的树种符号列表。我使用 PDO 准备好的语句就可以做到这一点:

$stmt=$conn->prepare('SELECT Symbol FROM Leaf WHERE Type = ? AND BroadArrangement = ? ');
$stmt->execute(array('B' , 'O'));
$i=0;

    while ($result = $stmt->fetch()) : ?>

    <li><a href="#"><?php print_r($result['Symbol']); ?> </a></li>
    <?php $i++;
      endwhile; 

当我替换查询和参数以与变量绑定时,会出现致命错误(见下文):

$q="'SELECT Symbol FROM Leaf WHERE Type = ? AND BroadArrangement = ? '";
$b= " 'B','O' ";

$stmt=$conn->prepare($q);
$stmt->execute(array($b));
$i=0;
    while ($result = $stmt->fetch()) : ?>
    <li><a href="#"><?php print_r($result['Symbol']); ?> </a></li>
    <?php $i++;
         endwhile; 

致命错误:带有消息 SQLSTATE[42000] 的未捕获异常“PDOException”:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 ''SELECT Symbol FROM Leaf WHERE Type = 附近使用正确的语法。AND BroadArrangement = ? /Applications/MAMP/htdocs/Tree_ID_Website/Compare/practice_compare.php:253 中的“第 1 行”堆栈跟踪:#0 /Applications/MAMP/htdocs/Tree_ID_Website/Compare/practice_compare.php(253): PDOStatement->execute (数组)#1 {main} 在第 253 行的 /Applications/MAMP/htdocs/Tree_ID_Website/Compare/practice_compare.php 中抛出

我有一种感觉,我错过了一些简单的东西,但我不知道是什么。当我打印或回显变量 $q 和 $b 时,它们与在正常工作的代码部分中传递的字符串相同。是变量范围的问题吗?还是我需要稍微修改变量?我尝试了没有运气的引号。

从其他帖子来看,当查询包含保留关键字时,通常会出现此错误。但我的没有,我很困惑。

谢谢你的帮助。

4

2 回答 2

1

这里有几个问题。首先是在构建语句时,$q首先用单引号引用它,然后用双引号引用它。它只需要作为一个普通的 PHP 字符串被引用一次:

// Quoted with just one set of quotes
$q="SELECT Symbol FROM Leaf WHERE Type = ? AND BroadArrangement = ?";

那么你的参数数组必须是一个数组,其中每个参数都是一个数组元素:

// Each param is an array element
$b = array('B', 0);

然后你可以准备和执行,$b作为参数传递给execute()

// Based on your error it looks like you have PDO configured to throw exceptions
// so use a try/catch block.
try {
  $stmt = $conn->prepare($q);
  $stmt->execute($b);
}
catch (PDOException $err) {
  // Oops error
  echo $err->getMessage();
}
于 2013-03-06T14:34:23.493 回答
1

这不会像您期望的那样工作:

$b= " 'B','O' ";

$c = array($b);

现在$c将是一个包含一个元素的数组,即字符串'B','O'

如果您确实有一个逗号分隔的字符串以及将其转换为数组的内容,则需要:

$c = explode(',' $b);

或者在你的情况下:

$stmt->execute( explode(',' $b) );
于 2013-03-06T14:45:05.587 回答