t0ze Posted July 25, 2013 at 03:36 PM Report #519954 Posted July 25, 2013 at 03:36 PM Boa tarde, Tenho um cenário em que é disponibilizado ao utilizador um filtro de pesquisa (select list) com as opções: ->No iventário value ="1" -> Fora do inventário value="0" ->Todos value="" Estes tem o value correspondente e é com base neste value que estou a fazer BindValue: $query->bindValue(':status', $filter['status'], PDO::PARAM_NULL); Que vai ser utilizado na query da seguinte forma AND (:status = '' OR product.exitreason_id IS :status) Portanto faço ali uns ifs pelo meio em que dou o valor a variável $filter['status'] com base no values do selectlist, se for value = "" então $filter['status'] = "" = o que faz com que na query se verifique (:satus = "") e mostra todos Mas o problema é ao fazer bind do IS NULL ou NOT Null que me dá erro: ERROSQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''NULL')' at line Alguém me pode ajudar sobre este bindValue e a forma correcta da sintaxe na query. Obrigado. Cumprimentos
AJBM Posted July 25, 2013 at 03:40 PM Report #519955 Posted July 25, 2013 at 03:40 PM Boas! Não percebi muito bem o teu problema, mas tenta isto PDO::ParamString em vez de null 1 Report
t0ze Posted July 25, 2013 at 04:05 PM Author Report #519961 Posted July 25, 2013 at 04:05 PM Obrigado AJBM, Usei if ($filter['status'] == "1") { $filter['status'] = "NULL"; } if ($filter['status'] == "0") { $filter['status'] = "NOT NULL"; } $query->bindValue(':status',$filter['status'],PDO::PARAM_STR); e AND (:status = '' OR product.exitreason_id IS :status) na mesma o erro 😞 ERROSQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''NULL')' at line
AJBM Posted July 25, 2013 at 04:53 PM Report #519973 Posted July 25, 2013 at 04:53 PM Para que precisas do null? E podes por todo o codigo que diz respeito ao erro aqui. E que não sei onde estas a usar o teu and 1 Report
Rui Carlos Posted July 25, 2013 at 04:58 PM Report #519975 Posted July 25, 2013 at 04:58 PM Para colocares o NULL experimenta bindValue(':status', null, PDO::PARAM_INT);. Ainda assim, não me admira que isso continue sem funcionar, visto que o NULL é parte do operador IS NULL, e não um parâmetro da query (mas não sou especialista em PDO para conhecer estes pormenores em detalhe). Adicionalmente, faz sentido teres dois :status na query? 1 Report Rui Carlos Gonçalves
t0ze Posted July 25, 2013 at 04:59 PM Author Report #519976 Posted July 25, 2013 at 04:59 PM Preciso do NULL para saber quais os produtos que estão em STOCK, ou (se a motivo da saida é NULL, então é porque ainda estão em stock) os outros AND's sao WHERE (:actuallocation_id = '' OR product.actuallocation_id = :actuallocation_id) AND (:classdetail_id = '' OR product.classdetail_id = :classdetail_id) E: AND (:status = '' OR product.exitreason_id IS :status) Para responder às perguntas: Todos (os que tao em stock e os que nao tao) Os que estão E os que não estão em stock
AJBM Posted July 25, 2013 at 05:22 PM Report #519981 Posted July 25, 2013 at 05:22 PM Abordagem que estas a fazer pode não ser a melhor. (null)??? Em relação ao where Tenta perceber esta query SELECT * FROM tabela WHERE (id=:id AND nome=:nome) OR (id=:id AND apelido=:apelido) depois fazes preparar a query, os binds e execute 1 Report
HappyHippyHippo Posted July 25, 2013 at 05:23 PM Report #519982 Posted July 25, 2013 at 05:23 PM eu nunca usei PDO (uso mysqli) por isso isto é só uma posta de pescada : http://www.php.net/manual/en/pdostatement.bindvalue.php#104939 $value = $filter['status'] == "" ? null : (int) $filter['status']; // <-- importante para forçar o valor de "null" if(is_int($value)) $param = PDO::PARAM_INT; elseif(is_bool($value)) $param = PDO::PARAM_BOOL; elseif(is_null($value)) $param = PDO::PARAM_NULL; elseif(is_string($value)) $param = PDO::PARAM_STR; else $param = FALSE; $query->bindValue(':status', $value, $param); 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted July 25, 2013 at 05:34 PM Report #519983 Posted July 25, 2013 at 05:34 PM WHERE (:actuallocation_id = '' OR product.actuallocation_id = :actuallocation_id) AND (:classdetail_id = '' OR product.classdetail_id = :classdetail_id) E: AND (:status = '' OR product.exitreason_id IS :status) É de mim ou essas condições não fazem sentido? Não devias ter product.exitreason_id = '' em vez de :status = ''? Em todo o caso, e como já referi, estás a tentar fazer bind de parte de um operador e não propriamente de um valor, o que não faz muito sentido. Acho que era melhor teres duas queries separadas. 1 Report Rui Carlos Gonçalves
t0ze Posted July 26, 2013 at 10:27 AM Author Report #520052 Posted July 26, 2013 at 10:27 AM Obrigado Rui, HappyHippy e AJBM @AJBM, percebi a querie que deste como exemplo só não percebi na medida que me podia ser util para o meu "cenário". desculpa. @Happy, a tua dica funcinou, mas só para quando 'pedia' os null's @Rui, resolvido com queries separadas 🙂 Obrigado
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now