2016-05-20 104 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"'); 
相关问题