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 構文にエラーがあります。Near ''SELECT Symbol FROM Leaf WHERE Type = ? ''SELECT Symbol FROM Leaf WHERE Type = ? AND ブロードアレンジメント = ? '' at line 1' in /Applications/MAMP/htdocs/Tree_ID_Website/Compare/practice_compare.php:253 スタック トレース: #0 /Applications/MAMP/htdocs/Tree_ID_Website/Compare/practice_compare.php(253): PDOStatement->execute (配列) #1 {main} が /Applications/MAMP/htdocs/Tree_ID_Website/Compare/practice_compare.php の 253 行目にスローされる

シンプルなものが欠けているような気がしますが、何がわかりません。変数 $q と $b を表示またはエコーすると、正しく機能するコードのセクションで渡された文字列と同じになります。変数のスコープに問題がありますか? または、変数を少し変更する必要がありますか? 私は運がなかったので引用符を返してみました。

他の投稿から、クエリに予約済みのキーワードが含まれていると、このエラーが発生することがよくあります。しかし、私のものはそうではなく、私は混乱しています。

ご協力いただきありがとうございます。

4

2 に答える 2

1

これは、次のように期待どおりに機能しません。

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

$c = array($b);

$cこれで、string という 1 つの要素を含む配列になります'B','O'

コンマで区切られた文字列とそれを配列に変換するものが本当にある場合は、次のものが必要です。

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

またはあなたの場合:

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

ここにはいくつかの問題があります。まず、ステートメントを作成するときに、$q最初に一重引用符で囲み、次に二重引用符で囲みます。プレーンな PHP 文字列として 1 回だけ引用する必要があります。

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

次に、パラメーターの配列は、各パラメーターが 1 つの配列要素である配列でなければなりません。

// 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 に答える