y a-t-il une fonction dans PHP qui ajoute des citations à une chaîne?
Comme Je fais ce qui suit: p> "" "STR." " CODE> P> P> P> P> P> Ceci est pour une requête SQL avec Varchars. J'ai cherché un peu, sans résultat ... p>
6 Réponses :
Tout d'abord, je vois que vous utilisez Ce que vous voudrez peut-être faire est de mettre une partie de cela dans une fonction: p> et ensuite: p> Stripslashes () code>. Cela implique que vous avez citations magiques sur. Je suggérerais de désactiver cela. $name = mysql_real_escape_string($_POST['name']);
// etc
$sql = <<<END
INSERT INTO companies
(name, country, chat_language)
VALUES
($name, $country, $language)
END;
Ce n'est pas que le code de l'OP est vulnérable à l'injection SQL, c'est que l'injection SQL n'est même pas une question pour les paramètres de déclaration préparés.
Un peu de problème de champ "non rempli" apparaît ici dans INSERT Avalue, autreValue code>, mais fonctionne
Créez votre propre.
function addQuotes($str){
return "'$str'";
}
Ou pour rendre la fonction encore meilleure, ajoutez-y également mysql_real_escape_string.
Ne faites pas cela. Au lieu de cela, utilisez des requêtes paramétrisées, telles que celles avec PDO . P >
Je suis débutant, PDO est complexe. Comment puis-je utiliser PDO dans ma situation concrète (j'ai ajouté du code)? Merci
La réponse de l'Outis va dans un peu de détail de bas niveau.
Plutôt que d'insérer la valeur directement dans la requête, utilisez et paramètres, qui ne sont pas vulnérables à Injection SQL .
$db = localDBconnect();
// map input fields to table fields
$fields = array(
'company' => 'company_name',
'country' => 'country',
'lang' => 'chat_language',
'fname' => 'contact_firstname',
'lname' => 'contact_lastname',
'email' => 'email',
'land' => 'tel_fix',
'mobile' => 'tel_mob',
'addr' => 'address',
'rating' => 'rating',
);
if ($missing = array_diff_key($fields, $_POST)) {
// Form is missing some fields, or request doesn't come from the form.
...
} else {
$registration = array_intersect_key($_POST, $fields);
$stmt = 'INSERT INTO `dbname`.`Companies` (`'
. implode('`, `', $fields) . '`) VALUES ('
. implode(', ', array_fill(0, count($registration), '?')) . ')';
try {
$query = $db->prepare($stmt);
$query->execute(array_values($registration));
} catch (PDOException $exc) {
// log an
error_log($exc);
echo "An error occurred. It's been logged, and we'll look into it.";
}
}
Comment créez-vous votre objet $ DB? J'ai essayé cela me donne Erreur fatale: appelez à une fonction de membre préparer () sur un non-objet dans .. code>
Avez-vous cliqué sur le lien dans le poteau? Ce texte bleu qui dit des déclarations préparées?
@Marius: Oui "Texte bleu" :) Je suis novice en PHP, pas dans ce forum :)
@outis. Lorsque la connexion je reçois: Erreur fatale: exception non capturée 'PDOException' avec message 'sqlstate [HY000] [2005] Hôte de serveur MySQL inconnu' localhost, dbname = mydbname '... code>, mais cela fonctionne avec < Code> mysql_connect ($ hôte, $ nom d'utilisateur, $ mot de passe) code> ...
@serhio: Modifiez la virgule dans le DSN en points-virgules (le code a été mis à jour pour le refléter). Cela montre la valeur de la lecture de la documentation ( PHP.net/Manual /en/ref.pdo-mysql.connection.php )
Apparemment, le PDO n'a pas été installé sur mon serveur d'hébergement, car "non utilisé". Ainsi, ou PDO est quelque chose de nouveau, ou pas si populaire.
L'extension PDO apparaît dans le référentiel source PHP ( CVS.PL.NET/VIEWVC.CGI/PHOP-SRC/EXT/PDO/... ) 5 ans, il y a 9 mois, le retour avant la version 5 était stable. À l'époque, il a été principalement installé comme une extension PECL. Il a été expédié avec PHP 5.1, il y a environ 4 1/2 ans. L'ancien pilote MySQL n'est pas encore devenu obsolète, mais ce n'est pas recommandé par les développeurs PHP. Si la construction PHP de votre serveur n'inclut pas PDO, votre hôte est tout à fait derrière les temps. De plus, s'ils ne l'offrent pas, bien sûr, il ne sera pas utilisé.
pensais que j'avais contribué une option qui répond à la question de "existe-t-il une fonction dans PHP qui ajoute des citations à une chaîne?" - Oui, vous pouvez utiliser str_pad () code> , bien qu'il soit probablement plus facile de le faire manuellement.
Avantages de le faire avec cette fonction est que vous pouvez également transmettre un caractère pour envelopper la variable nativable dans PHP: P>
function str_wrap($string = '', $char = '"')
{
return str_pad($string, strlen($string) + 2, $char, STR_PAD_BOTH);
}
echo str_wrap('hello world'); // "hello world"
echo str_wrap('hello world', '@'); // @hello world@
Ce n'est pas une fonction - mais c'est le premier message qui apparaît sur Google lorsque vous tapez "String PHP Wraps dans des guillemets". Si quelqu'un veut simplement envelopper une chaîne existante entre guillemets, sans l'exécuter à travers une fonction d'abord, voici la syntaxe correcte:
echo $var // hello $var = '"'.$var.'"'; echo $var // "hello"
CONSEIL GÉNÉRAL: Nommez toujours chaque colonne que vous insérez des valeurs à, avec simplement "Insert dans les valeurs de sociétés (". Valeurs $. ")" Votre requête va casser si vous modifiez la structure de votre table, ou mettez les arguments dans le mauvais ordre, ou ne pas mettre suffisamment d'arguments.
C'est une excellente ressource pour PDO: Kitebird.com/articles/php-pdo.html < / a>. Et, je suis d'accord avec les autres postes ici que les déclarations préparées sont à tous égards d'une manière supérieure de mettre en place une requête.
N'utilisez pas
Stripslashes () code> sans vérifier les citations magiques réglage GPC. Vous pouvez envelopper cela facilement dans une fonction personnaliséeget_string () code>.