20 vues
Bug requete sql avec ->where()
Blober

32 sujets, 248 réponses

Staff
Message non lu
Bonjour,

Je tient a report un bug (si c'en est un).

Lors du développement d'un widget, j'ai une requete sql qui doit être suivi par un OR.

J'ai remarqué que pour avoir un OR après cette requete il fallait faire une requete comme ceci :

$this->db->where('ma colonne', 'ma valeur', 'OR')

Mais un bug survient si la requete entière est dans la première colonne :

Requete en sortie pour type where('Ma requete = machin cachin', '', 'OR') : ma reqete = machin machin = ? OR suite de la requete
Requete si je met bien where('mon premier', 'mon dexième', 'OR') : mon premier = ? OR suite de la requete

Voici ma requete originale (2 version du bug)

$this->db->where('DATE_FORMAT(date, "%Y-%m-%d")', 'DATE_FORMAT((CURDATE() + INTERVAL 1 DAY), "%Y-%m-%d")', 'OR');
Sortie : WHERE DATE_FORMAT(DATE, "%Y-%m-%d") = ? OR
End User Support

rules make masters and masters make rules


https://discord.gg/btbAZU6 - Rejoignez nous sur le Discord de NeoFrag!
2 participants
4 réponses
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Salut !

La solution pour utiliser un OR :
$this->db->where('champ1', $valeur1, 'OR', 'champ2', $valeur2)
Blober

32 sujets, 248 réponses

Staff
Message non lu
Oh Ok merci eResnova.

Mais mon problème est que cette requette est utilisée seulement si un condition est vérifiée. Elle est donc "autonome". Elle rajoute juste une condition au début de ma requete. Du coup je veux juste comparer une valeur mais avec un OR pour la comparaison suivante.

Pour le coup, ta solution va quand même me mettre un AND après si je ne m'abuse.

J'ai remarqué en suivant la logique du fichier root/neofrag/core/db.php la chose suivante :

public function where($name, $value = NULL, $operator = 'AND')
{
if (func_num_args() > 3 && in_array(func_num_args() % 3, [0, 2]))
{
$args = [];

foreach (func_get_args() as $i => $arg)
{
if ($i % 3 == 0)
{
$args[] = [$arg];
}
else
{
$args[array_last_key($args)][] = $arg;
}
}

$this->_request['where'][] = array_map(function($a){
return (object)[
'name' => $a[0],
'value' => $a[1],
'operator' => !empty($a[2]) ? $a[2] : 'AND'
];
}, $args);
}
else
{
$where = (object)[
'name' => $name,
'value' => $value,
'operator' => $operator
];

if (func_num_args() == 1)
{
unset($where->value);
}
$this->_request['where'][] = $where;
}
return $this;
}

Du coup l'opérateur par défaut est AND. Si je ne met ma requete de comparaison dans $name, que je laisse vide $value ('') et que $operator je met OR, il m'affiche la première de mes erreurs.

Si je met bien mon premier élément de comparé dans $name et mon comparant dans $value puis le OR dans $operator, il me met la 2eme option.

Je ne sais pas si en entrant dans la fonction $value = '' il le met en null ou bien comme champs vide mais le considère comme présent et non NULL.
Dans tout mes cas $value donne un ? dans ma requête. Si je le met en NULL, il me rajoute IS NULL dans ma requete.
End User Support

rules make masters and masters make rules


https://discord.gg/btbAZU6 - Rejoignez nous sur le Discord de NeoFrag!
eResnova

17 sujets, 875 réponses

Contributeurs Staff
Message non lu
Ok,
Je comprend pas tout ton message mais si tu as besoin de faire une condition pendant ta requête, voici le principe :

$this->db ->select('champ1', 'champ2', 'etc..')
->join('...')
->where('user_id', $this->user...);

if ($test1 == 'blabla')
{
$this->db->where('champ', $valeur, 'OR', 'champ', $valeur);
}

$this->db->get();
Blober

32 sujets, 248 réponses

Staff
Message non lu
Ah merde je viens d'edit mon post avec plus de précision
End User Support

rules make masters and masters make rules


https://discord.gg/btbAZU6 - Rejoignez nous sur le Discord de NeoFrag!