2016-05-20 9 views
1

Doctrineを使用して準備済みのSQL文を作成しようとしています。 もし私のハードコードそれが働いているSQLクエリの値:PDOExceptionが発生する理由:SQLSTATE [42000]

public function search() 
{ 

    $sql  = 'SELECT `name` FROM `files` WHERE `name` = "myfile.exe"'; 
    $query  = $this->conn->prepare($sql); 
    $status  = $query->execute(); 
    $searchResult = $query->fetchAll(); 
    $searchResult = array(
        'service' => $searchResult, 
        'status' => $status 
       ); 
    $searchResult = $this->conn->fetchAll($sql); 


    return $searchResult; 
} 

しかし、私はそれは、私のPDOException与えないパラメータで値を渡すためにしようとした場合:SQLSTATE [42000]

public function search() 
{ 

    $sql  = 'SELECT `name` FROM `files` WHERE `name` = :service'; 
    $query  = $this->conn->prepare($sql); 
    $query->bindValue(":service", "myfile.exe"); 
    $status  = $query->execute(); 
    $searchResult = $query->fetchAll(); 
    $searchResult = array(
        'service' => $searchResult, 
        'status' => $status 
       ); 
    $searchResult = $this->conn->fetchAll($sql); 


    return $searchResult; 
} 

私が間違っていることを理解できません。ドキュメントhttp://doctrine-orm.readthedocs.io/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html

を見てみると

+0

SQLコマンドラインから直接SQL文を実行してみましたか?また、これはちょうど純粋なDoctrineコードですか、あるいはLaravelやSymfonyのようなPHPフレームワークを使用していますか? –

答えて

0

私は最終的に解決策を見つけるこの問題に引っかかって2日後。 私はただの行を削除します。

$searchResult = $this->conn->fetchAll($sql); 

ので、以下のコードは正常に動作している:

public function search($service) 
{ 

    $sql  = 'SELECT `name` FROM `files` WHERE `name` = ":service"'; 
    $query  = $this->conn->prepare($sql); 
    $query->bindValue(":service", $service); 
    $status  = $query->execute(); 
    $searchResult = $query->fetchAll(); 
    $searchResult = array(
        'service' => $searchResult, 
        'status' => $status 
       ); 


    return $searchResult; 
} 

はあなたの助けありがとうございました。

0

それは次のようになります。

public function search(){ 
    $sql  = 'SELECT `name` FROM `files` WHERE `name` = ?'; 
    $query  = $this->conn->prepare($sql); 
    $query->bindValue(1, "myfile.exe"); 
    $status  = $query->execute(); 
    $searchResult = $query->fetchAll(); 
    $searchResult = array(
       'service' => $searchResult, 
       'status' => $status 
      ); 
    $searchResult = $this->conn->fetchAll($sql); 

    return $searchResult; 
} 
+0

"PDOException:SQLSTATE [42000]:構文エラーまたはアクセス違反:1064 SQL構文にエラーがあります。正しい構文については、使用しているMySQLサーバーのバージョンに対応するマニュアルをチェックしてください。 1行目 "そして、私は名前付きパラメータを使用する必要があります。 – Angel115

+0

まあ正直言って私は多分何かを変えることができたような名前の準備されたステートメントの代わりに位置を使用していたかもしれないが、明らかにそうではない何かを見ない。あなたがしたこともまた働いたはずです。列名を追加する際に、間違って他のものを削除したり変更したりしていないことは確かですか? – Maantje

-2

それは、ファイル名を渡しながら、あなたが引用符のセットを失っているということだろうか?私はPHPをあまりしません。私はコメントしたいが、私の担当者は低すぎる。

これは機能しますか?

public function search() 
{ 

    $sql  = 'SELECT `name` FROM `files` WHERE `name` = ":service"'; 
    $query  = $this->conn->prepare($sql); 
    $query->bindValue(":service", "myfile.exe"); 
    $status  = $query->execute(); 
    $searchResult = $query->fetchAll(); 
    $searchResult = array(
        'service' => $searchResult, 
        'status' => $status 
       ); 
    $searchResult = $this->conn->fetchAll($sql); 


    return $searchResult; 
} 
+1

バインドされたプレースホルダの周りに引用符を入れないでください。 – Parfait

0

ああ - ファイル名の前後に引用符があります。 (働くかもしれない)、これを試してみてください:

$query->bindValue(':service', '"myfile.exe"'); 
関連する問題