web-dev-qa-db-fra.com

Insérer du code HTML dans une table mysql

J'utilise joomla pour gérer un site Web ... et je développe une application php autonome qui va insérer et modifier des données dans les tables utilisées par joomla pour stocker le code HTML des pages Web créées de manière dynamique ...

La façon dont cela fonctionne est que j'utilise un composant joomla pour créer du contenu et que le code html de ces articles est stocké dans un champ d'une table, par exemple content_table, par joomla .. Ce code html est ensuite récupéré pour construire une partie d'une page Web.

Je veux faire la même chose avec mon application autonome ... c.-à-d. Ajouter le code html au fichier déposé dans content_table, qui peut ensuite être récupéré par joomla pour construire la partie de la page.

Le problème est le suivant: le code html comporte naturellement beaucoup de guillemets simples et doubles, ce qui pose un problème lors de l'insertion dans la base de données .. J'ai essayé mysql_escape_string () et j'ai toujours des erreurs de syntaxe ..

Je peux utiliser addlashes () mais, joomla lui-même récupérant le code ultérieurement, il n'est pas possible d'utiliser stripslashes () lors de la récupération ultérieure ....

Y at-il de toute façon je peux ajouter le code HTML du champ de la table ...

Merci pour vos suggestions ... !!

Edit: Après avoir ajouté mysql_escape_string (), je reçois 

Error adding details. Reason : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'fulltext = '\n

Ceci est ma requête: 

UPDATE $jos_content
SET    introtext = '$intro_code',
       fulltext  = '$article_code'
WHERE  id = '$article_id'";

La chaîne d'entrée est la suivante: 

 $article_code = '<hr id="system-readmore" />
<center>{loadposition user50}</center>
<p style="text-align: center;">
<span style="color: rgb(0, 255, 255);">
<i>
<b>
<span style="font-size: x-large;">
<span style="font-family: Arial;">
&nbsp;
</span>
</span>
</b>
</i>
</span>
<span style="color: rgb(0, 255, 255);">
<i>
<b>
<span style="font-size: x-large;">
<span style="font-family: Arial;">
<?php echo $title; ?>
</span>
</span>
</b>
</i>
</span>
<span style="color: rgb(0, 255, 255);">
<i>
<b>
<span style="font-size: x-large;">
<span style="font-family: Arial;">
<br />
</span>
</span>
</b>
</i>
</span>
</p>
<p style="text-align: center;">
<img height="269" width="515" border="3" 
title="<?php echo $title; ?>" 
alt=" <?php echo $title; ?>"
src="<?php echo $article_image;?>"
</p> 
<p>
<span style="font-size: small;">
<span style="font-family: Arial;">
<span style="color: rgb(153, 204, 255);">
<p style="margin-top: 2px; margin-bottom: 2px; margin-left: 120px; text-align: left;">
<i> 
<span style="color: rgb(0, 255, 0);"> 
<strong>
Cast&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
</strong>
<b>
</b>
</span>
</i>
<span style="color: rgb(0, 255, 255);">
<b>
<?php echo $cast; ?>
</b>
</span>
<i>
<span style="color: rgb(0, 255, 255);">
<b>
<br />
</b>
</span>
</i>
<span style="font-family: Arial;">
<span style="font-size: small;">
<span style="color: rgb(153, 204, 255);">
</span>
</span>
<span style="color: rgb(0, 255, 0);">
<i>
<strong>
Direction&nbsp;&nbsp;&nbsp;
</strong>
</i>
<strong>
:
</strong>
<b>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<span class="href"
id="ctl00_ContentPlaceHolderMainContent_FormView1_Director">
<?php echo $director; ?>
</span>
</b>
</span>
</span>
<span style="font-family: Arial;">
<br />
<span style="color: rgb(0, 255, 0);">
<i>
<strong>
Production
</strong>
</i>
<strong>
:
</strong>
<b>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<?php echo $direction; ?>
</b>
</span>
<span style="color: rgb(255, 102, 0);">
<i>
<b>
<br />
</b>
</i>
</span>
<span style="font-family: Arial;">
<span style="color: rgb(0, 255, 0);">
<span style="font-family: Arial;">
<span style="font-size: small;">
<i>
<strong>
Music&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</strong>
</i>
<strong>
:
</strong>
</span>
</span>
</span>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<i>
</i>
<?php echo $music; ?>
<i>
<br />
<span style="color: rgb(0, 255, 0);">
Lyrics&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</i>
<span style="color: rgb(0, 255, 0);">
:
</span>
<i>
</i>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<?php echo $lyrics; ?>
</b>
</span>
<span style="color: rgb(0, 255, 255);">
<b>
<i>
<br />
</i>
<span style="color: rgb(0, 255, 0);">
<i>
Year&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</i>
:
</span>
<?php echo $year; ?>
</b>
</span>
</span>
<i>
<span style="color: rgb(0, 255, 255);">
<b>
</b>
</span>
</i>
</p>
</span>
</span>
</span>
</p>
<p>
<left>
{loadposition user14}
&nbsp;
</left>
</p>
<div style="text-align: center;">
<p>
<i>
<span style="font-family: Arial;">
<b>
<span style="font-size: medium;">
<span style="color: rgb(51, 255, 255);">
Click
<img src="images/stories/Play button1.png"
alt="alt" />
in the Playlist to Download Songs
</span>
</span>
</b>
</span>
</i>
</p>
</div>
<table border="0" align="center">
<tbody>
<tr>
<td>
<h4 style="text-align: center;">
<i>
<span style="color: rgb(102, 255, 0);">
<b>
<b>
&nbsp;High Bandwidth Users
</b>
</b>
</span>
</i>
<i>
<span style="color: rgb(102, 255, 0);">
<b>
<b>
&nbsp;
</b>
</b>
</span>
</i>
<span style="color: rgb(102, 255, 0);">
<b>
</b>
</span>
</h4>
</td>
<td>
<h4 style="text-align: center;">
<i>
<span style="color: rgb(102, 255, 0);">
<b>
<b>
&nbsp;Low Bandwidth Users
</b>
</b>
</span>
</i>
<span style="color: rgb(102, 255, 0);">
<b>
<br />
</b>
</span>
</h4>
</td>
</tr>
<tr>
<td>
{auto width=&quot;235&quot; displayheight=&quot;0&quot; height=&quot;225&quot;} <?php echo $hqList; ?> {/auto}
</td>
<td>
{auto width=&quot;235&quot; displayheight=&quot;0&quot; height=&quot;225&quot;}<?php echo $lqList; ?>{/auto}
</td>
</tr>
</tbody>
</table>
<center>
{loadposition user50}
</center>';
13
SpikETidE

Eh bien..Le debugged .. Il s'avère que le problème n'était finalement pas lié à la fonction d'échappement ...

Découvrez la requête:

UPDATE $jos_content
SET    introtext = '$intro_code',
       fulltext  = '$article_code'
WHERE  id = '$article_id'";

Vous pouvez voir le champ 'fulltext' ... Apparemment, le mot "fulltext" est un mot clé mysql ... Pour être précis, il s'agit d'un type de champ comme TEXT, INT, MEDIUMTEXT, etc.

J'ai changé la requête à cette

"UPDATE $jos_content
SET    $jos_content.introtext = '$intro_code',
       $jos_content.fulltext  = '$article_code'
WHERE  $jos_content.id = '$article_id'";

Et voila ... !!!! 

2
SpikETidE

Je préfère convertir le code en chaîne ordinaire avant de l'insérer dans la base de données. Je pense que c'est le scénario le plus sûr. Pensez à utiliser ce code:

$article_code = base64_encode($article_code);
/* insert to database */

Ainsi, lorsque vous souhaitez utiliser ce code en retour, il suffit de le décoder à l'aide de base64_decode. Je vous suggère d'utiliser le type de données 'text' pour enregistrer $ article_code plutôt que 'varchar'.

27
iroel

Vous ne devriez pas avoir besoin de barres obliques. Les guillemets sont la seule cause des problèmes lors des insertions normales. mysql_escape_string() devrait gérer cela, à l’exception des problèmes de jeu de caractères. Essayez aussi mysql_real_escape_string().

Notez également que le fait de stocker du code HTML brut fourni par l'utilisateur dans la base de données peut entraîner des problèmes de sécurité. Envisagez plutôt d'utiliser quelque chose comme bbcode ou markdown.

C'est le meilleur moyen que j'ai trouvé addslashes() 

$article_code = addslashes($article_code);

UPDATE $jos_content
SET    introtext = '$intro_code',
       fulltext  = '$article_code'
WHERE  id = '$article_id'";
4
Ajay Kumar

Juste pour confirmer, votre requête ressemble à ceci:

$query = '
    UPDATE "'.mysql_real_escape_string ($jos_content).'"
    SET    introtext = "'.mysql_real_escape_string ($intro_code).'",
           fulltext  = "'.mysql_real_escape_string ($article_code).'"
    WHERE  id = "'.mysql_real_escape_string ($article_id).'"
";
1
K Prime

fulltext est un mot clé mysql prédéfini. Veuillez utiliser Acute (`) ou guillemets simples (')

Voici le code - 

UPDATE $jos_content
SET    `introtext` = '$intro_code',
       `fulltext`  = '$article_code'
WHERE  `id` = '$article_id'";
1
Chinmay235

J'ai eu le même problème, je l'ai corrigé avec des expressions régulières. Vous pouvez utiliser quelque chose comme ceci: $target = '{~p class={{q}}important-text{{q}}~}Some text here {~/p~}';

puis utilisez la fonction preg_replace():

class handle  
{ 
  public static function makehtml($target)   
  {
    $output = preg_replace("#{~#", "<", $target);
    $output = preg_replace("#~}#", ">", $target);
    $output = preg_replace("#{{q}}#", '"', $target);  
    return $output;
 }  
}  
echo handle::makehtml($target);
// output : <p class="important-text">Some text here</p>
1
Waiyl Karim

si vous êtes préoccupé par l'espace et utilisez la méthode de codage en base 64 publiée ici, vous pouvez utiliser la commande gzdeflate en php pour le réduire puis le coder. Voici un petit script de test sur quelques exemples de caractères générés. Évidemment, il existe différentes méthodes de compression à examiner si vous êtes préoccupé par la taille, mais cela signifierait que vous pourriez le mettre dans mysql en réduisant la taille sur la base de données. Vous pouvez ensuite le relire avec gzinflate (base64_decode (...));

<?php
//generate sample chars for the example
function generateRandomString($length = 10000) {
    $characters = '01234"56/789abcdefghij:klmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[Rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}
//

$string =generateRandomString();
echo 'string size:'.strlen($string);
$b64html = base64_encode($string);
echo '<br/>'.'Original base64 size:'.strlen($b64html);
$compressed = gzdeflate($string,  9);
echo '<br/>'.'compressed size:'.strlen($compressed);
echo '<br/>'.'base64 compressed size:'.strlen(base64_encode($compressed));
 /* insert into db the base64_encode($compressed); */
?>
0
Rob Smart

Appeler la fonction mysql_escape_string () en passant la variable qui contient le texte html comme ceci:

mysql_escape_string ($ _ POST ["text"]); 

veillera à ce que les caractères spéciaux tels que les guillemets dans le texte ne causent pas d'erreur php et que la base de données soit mise à jour avec succès.

0
user3053637

insérer du code html dans la base de données

$title = $_POST['title'];
$code = '<h1>hello</h1></p>this html tage</p>';
$htmlcode = addslashes($code);

 $query = "INSERT INTO `template` (`title`,`code`) VALUES ('".$title."','".$htmlcode."');"; 
mysqli_query($con,$query);

après avoir inséré les données dans la base de données, afficher les données dans la page de liste

$result = mysqli_query($con,'SELECT * FROM template');                                  
while($row = mysqli_fetch_assoc($result)) {

 echo htmlentities($row['code']);

}
htmlentities($row['code']); //here your row name;
0
nirali