Je cherche une bonne réponse qui est préférable à utiliser entre IntTval () et Sprintf (% d ') surtout sur la désinfection des caractères indésirables? ou P> function getOffsetLimit($offset, $max = 100)
{
$sql = sprintf(" LIMIT %d, %d", $offset, $max);
return $sql
}
4 Réponses :
À compter du moment, je m'occupe de l'héritage et j'ai créé un conducteur pour gérer entre des déclarations préparées et non préparées. En supposant que je ne puisse pas utiliser une déclaration préparée, sur mon exemple, lequel est le meilleur?
Je ne pense pas que c'est la réponse .. Je traite des codes hérités et tous utilisent toujours MySQL_Query ().
Ni est meilleur. La solution appropriée serait d'utiliser Déclarations préparées forte> A> avec Si vous insistez absolument sur la construction SQL avec des chaînes concaténées, j'utiliserais $ data_type code> argument pour
pdostatement :: bindparam () code> - qui vous permet de filtrer les entiers. P>
filtre_var () code>
avec soit filtre_validate_int code> (si vous souhaitez abandonner lorsque les valeurs ne sont pas des entiers) ou
filtre_sanitize_number_int code> (Si vous souhaitez convertir la valeur en un télécopieur entier raisonnable.) P>
Ouais, "-5 + 3-8 + 7-" ou "------ ++++++" est incroyable fac-similé raisonnable entier - comme un fac-similé i>
Ni intval () code> ni
printf () code> fonctionne pour ce cas, c'est pourquoi vous ne devez utiliser aucun d'entre eux.
Notez également que filtre_var () code> prend en charge les valeurs min / max arbitraires, vous permettant de limiter les positifs - que ni
intval () code> ni
printf () code > peut faire.
Étant donné que la limite et le décalage ne fonctionnent pas avec des déclarations préparées, la meilleure méthode suivante consiste à utiliser filter_var () avec filtre_validate_int. Je pense que pour la limite et le décalage, filter_sanitize_number_int ne doit pas être utilisé.
Notez que vous ne pouvez pas avoir de compensation sans limite dans MySQL et le code ci-dessous est pour MySQL. P>
function getLimitOffsetStatement($limit=null, $offset=null) { $sql = ''; $filterOptions = ['options'=>['min_range' => 0]]; if (filter_var($limit, FILTER_VALIDATE_INT, $filterOptions)) { $sql .= " LIMIT $limit"; if (filter_var($offset, FILTER_VALIDATE_INT, $filterOptions)) { $sql .= " OFFSET $offset"; } } return $sql; }
C'est une approche géniale aussi ... merci.
Si vous travaillez avec le code hérité, alors quelque chose aussi simple que cela fonctionnera ...
function build_sql_limit ( $total, $offset, $max = 100 ) { if ( ctype_digit ( $total ) ) { $total = $total > $max ? $max : $total; } else { $total = $max; } if ( ! ctype_digit ( $offset ) ) { $offset = NULL; } return ' LIMIT ' . ( is_null ( $offset ) ? $total : $offset . ', ' . $total ); }
Ne faites pas l'un ou l'autre de ces. Utilisez Déclarations préparées B> avec Paramètres liés B> . Voir Cette page B> et Ce message B> pour de bons exemples.
Ni: Mot-clé limite sur MySQL avec déclaration préparée
Dupliqué possible de Comment puis-je empêcher l'injection SQL dans PHP?
Vérifiez auprès de Regex pour des caractères exacts que vous autorisez à la place
@Andrew - Utiliser Regex pour cela serait une excédence extrême. Juste parce que vous peut i> faire quelque chose avec regex ne signifie pas que c'est une bonne idée.
Limiter CODE> permet uniquement aux entiers que vous pouvez gérer très bien sans regex. Cependant, comme d'autres personnes ont mentionné, tout ce qui est le mauvais chemin de chaque sens.
Bonjour, je traite des codes hérités à ce moment-là. En supposant que je ne puisse pas utiliser une déclaration préparée, donnez-vous à l'exemple des codes ci-dessus, lequel est le meilleur? Merci.
Cela ne serait-il pas le moment idéal pour refroidir le code afin que vous puissiez l'utiliser?
Vous devez mettre tous les efforts pour la mise à niveau de PHP4 (en supposant que c'est la raison pour laquelle vous ne pouvez pas utiliser des déclarations préparées) et éloignez-vous des requêtes SQL concaténées.
prendrait des âges pour le faire ... L'ensemble du système utilisant legacy mysql_Query () fonctions ... estimé aura 5 ans pour le faire et tuera l'entreprise. En quelque sorte, nous sommes sur le processus de refactoring, mais nous sommes en ressources.
@camsy: Votre premier échantillon est sans danger pour l'integer s'échappant. Vous pouvez également essayer
$ numéro = (int) $ string code>, c'est un alias pour
intval code> fonction.
@ user1597430 merci ..
point est de jeter l'entrée de l'utilisateur sur une mauvaise idée entière, de donner une erreur et de les faire mettre dans un entier à la place