2016-05-20 103 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

您是否嘗試過直接從MySQL命令行運行sql語句來查看是否有效?此外,這是純粹的學說代碼,還是使用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"'); 
相關問題