Questionnement sur la judicieuse utilisation de '%s' ou %s

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Questionnement sur la judicieuse utilisation de '%s' ou %s

par Gofromiel » 05 janv. 2008, 22:06

Nan, j'utilise pas sprintf(), voici un bout de ma classe WdDatabase, qui étend ma classe WdMySQL:
	function Query($query)
	{
		$args = func_get_args();
		
		array_shift($args);

		if (isset($args[0]) and is_array($args[0]))
		{
			# an array has been provided, instead of pushed arguments
	
			$args = $args[0];
		}
		
		$this->query_args =& $args;

		$query = preg_replace_callback
		(
			'#(%d|%s|%f|%F|%b|%%)#',
			array(&$this, '_query_callback'),
			$query
		);
				
		$rc = parent::Query($query, $er);
		
		if (!$er)
		{
			return $rc;
		}
	}
	
	function _query_callback($match)
	{
		switch ($match[1])
		{
			# We must use type casting to int to convert FALSE/NULL/(TRUE?)
			# We don't need db_escape_string as numbers are db-safe

			case '%d': return (int) array_shift($this->query_args); 
			case '%s': return parent::EscapeString(array_shift($this->query_args));
			case '%%': return '%';
			case '%f': return (float) array_shift($this->query_args);
			case '%F': return array_shift($this->query_args);
			
			# binary data
			
			case '%b': return parent::EncodeBlob(array_shift($this->query_args));
		}
	}

par Hubert Roksor » 05 janv. 2008, 21:54

Mon avis : n'utilise pas sprintf() pour tes requêtes, il n'est pas fait pour ça. Si tu es sous PHP5, remplace-le par PDO ou MySQLi et utilise les requêtes préparées. Et si tu es sous PHP4... c'est l'heure de changer d'hébergeur.

Questionnement sur la judicieuse utilisation de '%s' ou %s

par Gofromiel » 05 janv. 2008, 18:58

Bonjour,

J'utilise le formatage de chaine pour protéger mes transactions SQL. Par exemple :

Code : Tout sélectionner

SELECT * FROM `%s` WHERE `%s` = '%s'
une fois formaté, donnera la requête suivante :

Code : Tout sélectionner

SELECT * FROM `user_users` WHERE `username` = 'gofromiel'
Bien sur, les chaines de caractères mises à la place des %s sont passées à mysql_real_escape_string().

Ce qui m'ennuie dans tout ça c'est que si une chaine est vide je me retrouve avec '' et non NULL. Et je ne peux pas simplement retourner NULL à la place de %s, puisque j'obtiendrais la chaine 'NULL'... ce qui est nul du coup.

Donc, mon idée est de virer les apostrophes autour de %s et d'ajouter %n pour les noms de champs. Ce qui nous donnerait :

Code : Tout sélectionner

SELECT * FROM %n WHERE %n = %s
Cela permet déjà de distinguer les noms de champs de leurs valeurs et me permet de remplacer %s par NULL si la chaine est vide.

Le problème c'est que je ne suis pas sur que ce soit une très bonne idée.

Avez-vous un avis éclairé à partager ?