Bizarrerie php/sql (edition de table)

Eléphanteau du PHP | 17 Messages

14 avr. 2010, 15:48

Salut...

J'ai fait un site en local, avec une interface utilisateur permettant de modifier le texte de certaines sections du site, via un textarea à remplir qui quand on le valide appelle un fichier php qui effectue une requête sql pour mettre à jour la base de donnée (qui est appelée dans les sections éditables du site).

Ca marche bien, sauf avec les copiers collés, je ne sais pas pourquoi certains textes passent et d'autres pas, je prends deux extraits d'un même site au hasard ( http://www.lipsum.com/)

Quand je copie le texte ci dessous, pas de problème, c'est édité:
The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.
Par contre quand je copie le texte suivant, ça ne passe pas:
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
Pourtant il n'y a pas plus de texte, est-ce que vous savez quelle peut-être la raison de cette bizarrerie?

A tout hasard voici le code php du processus d'édition de la table:
<?php
// dans un premier temps regarde quel formulaire d'édition a été validé, il y en a 8 différents

if(isset($_POST["sfaire"])){
    $contenu=utf8_encode($_POST["sfaire"]);
    $id=1;
    if(strlen($contenu) > 560){
        header("location: troplong.php");
    }
}

elseif(isset($_POST["meca"])){
    $contenu=utf8_encode($_POST["meca"]);
    $id=2;
    if(strlen($contenu) > 560){
    header("location: devis.php");
    }

}

elseif(isset($_POST["chimie"])){
    $contenu=utf8_encode($_POST["chimie"]);
    $id=3;
}

elseif(isset($_POST["marketing"])){
    $contenu=utf8_encode($_POST["marketing"]);
    $id=4;
}

elseif(isset($_POST["col1"])){
    $contenu=utf8_encode($_POST["col1"]);
    $id=5;
}

elseif(isset($_POST["col2"])){
    $contenu=utf8_encode($_POST["col2"]);
    $id=6;
}

elseif(isset($_POST["col3"])){
    $contenu=utf8_encode($_POST["col3"]);
    $id=7;
}

else{
    $contenu=utf8_encode($_POST["travail"]);
    $id=8;
}

//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------MYSQL-------------------------------------
//Connexion
$connection=mysql_connect("localhost","root","");

//selection de la database

$selection=mysql_select_db("budget",$connection);

// utf8 pour les caractères spécifiques au français

mysql_query("SET NAMES 'utf8'");




//requête: mise à jour

$resultat=mysql_query("UPDATE miseajour SET contenu =  '$contenu'  WHERE id = '$id' ");

mysql_close($connection);


//-------------------------------------------------------------
//------------------REDIRECTION---------------------------------
//-------------------------------------------------------------

header("location: maj2.php"); ?>



Eléphant du PHP | 422 Messages

14 avr. 2010, 17:16

hello

il y a pas une ' dans ton texte ?
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Mammouth du PHP | 672 Messages

14 avr. 2010, 17:19

bonjour.

Dasn des cas comme ça (problèmes avec une BDD), les premiers reflexes à avoir (uniquement pour les tests, à enlever impérativement en exploitation):
- Afficher les requêtes pour vérifier qu'elle est bien construite (par exemple en la passant sous phpMyAdmin)
- Suivre les fonctions mysql de or die (ou tester si le retour a pour valeur FALSE).
=>
<?php//Connexion
$connection=mysql_connect("localhost","root","") or die ("Erreur de connection : ".mysql_error());

//selection de la database
$selection=mysql_select_db("budget",$connection) or die ("Erreur de sélection : ".mysql_error());

// utf8 pour les caractères spécifiques au français
mysql_query("SET NAMES 'utf8'") or die ("Erreur sur UTF8 : ".mysql_error());

//requête: mise à jour
$requete = "UPDATE miseajour SET contenu =  '$contenu'  WHERE id = '$id' ";
echo "Requête = $requete";
$resultat=mysql_query($requete) or die ("Erreur de requete : <br />Requete = $requete<br />Erreur = ".mysql_error());
Au passage tu devrais en profiter pour sécuriser un peu tes données reçues par POST.
En faisant une recherche sur le net, tu devrais trouver de quoi, mais au minimum pense à [yrl=http://fr.php.net/manual/fr/function.my ... string.php]mysql_real_escape_string[/url]...

Eléphanteau du PHP | 17 Messages

14 avr. 2010, 17:46

hello

il y a pas une ' dans ton texte ?
Tu as raison c'est probablement la cause du problème, quand je tape un texte avec une apostrophe ça ne passe pas, systématiquement, merci :D
Je vais essayer de trouver tout seul comment régler ce problème ;)
bonjour.

Dasn des cas comme ça (problèmes avec une BDD), les premiers reflexes à avoir (uniquement pour les tests, à enlever impérativement en exploitation):
- Afficher les requêtes pour vérifier qu'elle est bien construite (par exemple en la passant sous phpMyAdmin)
- Suivre les fonctions mysql de or die (ou tester si le retour a pour valeur FALSE).
=>
<?php//Connexion
$connection=mysql_connect("localhost","root","") or die ("Erreur de connection : ".mysql_error());

//selection de la database
$selection=mysql_select_db("budget",$connection) or die ("Erreur de sélection : ".mysql_error());

// utf8 pour les caractères spécifiques au français
mysql_query("SET NAMES 'utf8'") or die ("Erreur sur UTF8 : ".mysql_error());

//requête: mise à jour
$requete = "UPDATE miseajour SET contenu =  '$contenu'  WHERE id = '$id' ";
echo "Requête = $requete";
$resultat=mysql_query($requete) or die ("Erreur de requete : <br />Requete = $requete<br />Erreur = ".mysql_error());
Au passage tu devrais en profiter pour sécuriser un peu tes données reçues par POST.
En faisant une recherche sur le net, tu devrais trouver de quoi, mais au minimum pense à [yrl=http://fr.php.net/manual/fr/function.my ... string.php]mysql_real_escape_string[/url]...
Merci bien pour le tuyau, je vais de ce pas me familiariser avec mysql-real-escape-string, d'autant plus que ce n'est pas la première fois que j'en entends parler :!: edit: en fait j'ai l'impression que l'absence de real-escape-string est la cause de mon problème.

Eléphanteau du PHP | 17 Messages

14 avr. 2010, 18:09

J'ai réglé le problème c'était bien à cause de l'apostrophe et j'ai pu corriger le tir grâce à la fonction mysql_real_escape_string($contenu), merci beaucoup à vous deux =D>