Marqueur nommé ou interrogatif pour les requetes préparées ?

WRInaute impliqué
Bonjour,

je commence à me poser vraiment la question concernant les marqueurs. Il est vraiment que les marqueurs interrogatifs sont vraiment plus simple à mettre en place, mais qu'elle est réellement la préconisation lorsque l'on fait des requetes préparées ? J'ai l'impréssion que bindValue et les différents paramètres que l'on ajoute lors des requêtes nommés ne sont que accessoire pour la sécurité.

Marqueur interrogatif :

Code:
$sql = "SELECT id FROM test WHERE id_ad = ? AND title LIKE  ? LIMIT 1";
 
$requete = $bdd -> prepare($sql);
$requete->execute(array($id_ad, $title));

Marqueur nommé :

Code:
$sql = "SELECT id FROM test WHERE id_ad = :id_ad AND title LIKE  :title LIMIT 1";
 
$requete = $bdd -> prepare($sql);
 
$requete ->bindValue(':id_ad', $id_ad, PDO::PARAM_INT);
$requete ->bindValue(':title', $title, PDO::PARAM_STR);
 
$requete->execute();

Merci pour vos conseils.
 
WRInaute passionné
C'est juste que quand c'est nommé, c'est plus simple de s'y retrouver, moins d'erreur possible : quand on modifie la requête, ajoute un paramètre entre deux, il faut pas se tromper dans l'ordre quand ce n'est pas nommé.
Quand c'est possible, j'utilise les paramètres nommés, mais j'ai eu un cas où ça n'était pas possible (à la cause de la base qui ne les acceptait pas où de l'ORM je ne sais plus).
 
WRInaute impliqué
Jusqu'a présent j'utilise essentiellement les marqueurs nommés et j'ai l'impression d’être un peu un extraterrestre quand je consulte les forums. Beaucoup de monde privilégie les marqueur interrogatifs visiblement.
 
WRInaute impliqué
Et finalement quel est l'interet de bindValue et PDO::pARAM_INT ou PDO::pARAM_STR si on peut faire sans ?

Est ce que c'est pour renforcer la sécurité contre les injection sql par exemple ?
 
WRInaute passionné
Jusqu'a présent j'utilise essentiellement les marqueurs nommés et j'ai l'impression d’être un peu un extraterrestre quand je consulte les forums. Beaucoup de monde privilégie les marqueur interrogatifs visiblement.

Ah bon ! Peut-être en PHP, mais je fréquente d'autres domaines (Delphi, .NET...) où c'est le contraire, où le plus important est que ce soit un code clair et compréhenisble pour un travail en équipe professionnel...

Et finalement quel est l'interet de bindValue et PDO::pARAM_INT ou PDO::pARAM_STR si on peut faire sans ?

Est ce que c'est pour renforcer la sécurité contre les injection sql par exemple ?

A priori ici non, ça ne semble servir à pas grand chose (et même à rien) d'après ce que j'ai lu, mais il faudrait investiguer davatange.
Car des gens disent que ça ne lève même pas d'erreur (si on met par exemple un integer alors qu'on attend une string).
Le seul cas utile, ça semble être de forcer la conversion d'un integer en booléen ou inversement d'un booléen en integer.
 
WRInaute impliqué
spout tu es plutot partisan de ceci :

Code:
$sql = "SELECT id FROM test WHERE id_ad = :id_ad AND title LIKE  :title LIMIT 1";

$requete = $bdd -> prepare($sql);

$requete->execute(array('id_ad' => $id_ad, 'title' => $title));

ou cela ? :

Code:
$sql = "SELECT id FROM test WHERE id_ad = :id_ad AND title LIKE  :title LIMIT 1";

$requete = $bdd -> prepare($sql);

$requete ->bindValue(':id_ad', $id_ad, PDO::PARAM_INT);
$requete ->bindValue(':title', $title, PDO::PARAM_STR);
 
$requete->execute();
 
WRInaute accro
C'est pas comparable, mais j'utilise plus souvent le 1°, la différence c'est qu'il va mettre des quotes sur un string et pas sur un integer. Avec MySQL osef, mais avec un vrai SGBD comme Oracle ou PostgreSQL pas.

Par contre je préfère :
PHP:
DB::select("SELECT id FROM test WHERE id_ad = :id_ad AND title LIKE  :title", compact('id_ad', 'title'));

Ou encore mieux :
PHP:
Test::whereIdAd($idAd)->whereTitle($title)->get()->first();
 
Dernière édition:
Discussions similaires
Haut