Jump to content

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


t0ze

Recommended Posts

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

Link to post
Share on other sites

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

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
Link to post
Share on other sites

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

Link to post
Share on other sites

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
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
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
Link to post
Share on other sites

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

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.