Jump to content
t0ze

[Resolvido] PDO, bindParam "IS NULL" ou "IS NOT NULL"

Recommended Posts

t0ze

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

Share this post


Link to post
Share on other sites
AJBM

Boas!

Não percebi muito bem o teu problema, mas tenta isto PDO::ParamString em vez de null

  • Vote 1

Share this post


Link to post
Share on other sites
t0ze

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

Share this post


Link to post
Share on other sites
AJBM

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

  • Vote 1

Share this post


Link to post
Share on other sites
Rui Carlos

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?

  • Vote 1

Share this post


Link to post
Share on other sites
t0ze

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

Share this post


Link to post
Share on other sites
AJBM

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

  • Vote 1

Share this post


Link to post
Share on other sites
HappyHippyHippo

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);

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Rui Carlos

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.

  • Vote 1

Share this post


Link to post
Share on other sites
t0ze

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.