9
votes

Cordon surround avec des citations

y a-t-il une fonction dans PHP qui ajoute des citations à une chaîne?

Comme "" "STR." " Ceci est pour une requête SQL avec Varchars. J'ai cherché un peu, sans résultat ...

Je fais ce qui suit: xxx


3 commentaires

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 () sans vérifier les citations magiques réglage GPC. Vous pouvez envelopper cela facilement dans une fonction personnalisée get_string () .


6 Réponses :


9
votes

Tout d'abord, je vois que vous utilisez Stripslashes () code>. Cela implique que vous avez citations magiques sur. Je suggérerais de désactiver cela.

Ce que vous voudrez peut-être faire est de mettre une partie de cela dans une fonction: p> xxx pré>

et ensuite: p>

$name = mysql_real_escape_string($_POST['name']);
// etc
$sql = <<<END
INSERT INTO companies
(name, country, chat_language)
VALUES
($name, $country, $language)
END;


2 commentaires

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 , mais fonctionne



4
votes

Créez votre propre.

function addQuotes($str){
    return "'$str'";
}


1 commentaires

Ou pour rendre la fonction encore meilleure, ajoutez-y également mysql_real_escape_string.



3
votes

Ne faites pas cela. Au lieu de cela, utilisez des requêtes paramétrisées, telles que celles avec PDO .


2 commentaires

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.



11
votes

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.";
    }
}


7 commentaires

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 ..


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 '... , mais cela fonctionne avec < Code> mysql_connect ($ hôte, $ nom d'utilisateur, $ mot de passe) ...


@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é.



8
votes

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@


0 commentaires

2
votes

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"


0 commentaires