Problème retour à la ligne dans un array

Petit nouveau ! | 6 Messages

23 oct. 2007, 20:51

Bonjour,

Php, Mysql, javascript.

Voilà ce que je désirais faire au départ.

J'ai une table suivante :

Code : Tout sélectionner

CREATE TABLE `t_items_connus` ( `num_item_connu` mediumint(9) NOT NULL auto_increment, `nom_item` text, `type` text, `categorie` text, `description` text, PRIMARY KEY (`num_item_connu`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Dans un formulaire j'ai un select lié au champ [nom_item], lorsque je clique sur le nom de l'item, je désire afficher le type, dans un select, la categorie dans un select et la description dans un textarea.

J'ai réussi à faire tout ça. Mais le problème vient du fait que je peux avoir des retours à la ligne dans mon champ description et je n'arrive pas à les gérer.

Pour résoudre l'erreur unterminated string literal, j'ai essayé les fonctions suivantes urlencode() et urldecode() - str_replace() - nl2br() - Mais je ne sais pas où les utiliser dans mon code.

Pourriez vous m'aider Svp, celà fait une semaine que je bloque dessus.

Mon code ci-desous :
<?php
// Convertit un tableau PHP en déclaration d'un tableau javascript
// $tableau : variable tableau PHP à convertir
// $monjs : nom de la variable tableau en javascript
// $prempass : /!\ NE PAS UTILISER : sert à différentier le premier passage
// des passages récursifs, je n'ai pas déclaré une seconde fonction pour des
// raisons de portabilité...
//
// Utilisation commune : conv_tabjs($tableau, "nomJS");
// Concepteur : Rivenbis
// Src : http://www.phpcs.com/codes/CONVERSION-TABLEAU-PHP-DECLARATION-TABLEAU-JAVASCRIPT_22362.aspx
function conv_tabjs($tableau, $nomjs, $prempass=true)
{
	if($prempass)
	{
		$taille = count($tableau);
		echo "var ".$nomjs." = new Array(".$taille.");\n";
		foreach($tableau as $key => $val)
		{
			if(is_string($key)) $key = "'".$key."'";
			conv_tabjs($val, $nomjs."[".$key."]", false);
		}
	}
	else
	{
		if(is_array($tableau))
		{
			echo($nomjs." = new Array(".count($tableau).");\n");
			foreach($tableau as $key => $val)
			{
				if(is_string($key)) $key = "'".$key."'";
				conv_tabjs($val, $nomjs."[".$key."]", false);
			}
		}
		else
		{
			if(is_string($tableau)) $tableau = "'".addcslashes($tableau,"'")."'";
			echo($nomjs." = ".$tableau.";\n");
		}
	}
} 
?>


<?php
// Mettre le resultat de la requete dans le tableau $tab_php
$req_item_connu=mysql_query("SELECT * FROM t_items_connus ORDER BY nom_item ASC");
$elem=1; 
while($champs=mysql_fetch_array($req_item_connu))
{
	$tab_php[$elem]=$champs;
	$elem++;
}
?>

<?php
// Mettre le resultat de la requete dans le tableau $tabtype_php
$req_type=mysql_query("SELECT * FROM t_type");
$elemtype=1; 
while($champstype=mysql_fetch_array($req_type))
{
	$tabtype_php[$elemtype]=$champstype;
	$elemtype++;
}
?>

<?php
// Mettre le resultat de la requete dans le tableau $tabcate_php
$req_cate=mysql_query("SELECT * FROM t_categorie ORDER BY id_categorie ASC");
$elemcate=1; 
while($champscate=mysql_fetch_array($req_cate))
{
	$tabcate_php[$elemcate]=$champscate;
	$elemcate++;
}
?>

<script language="JavaScript">
// Cette fonction est appelé par la fonction onchange() du select qui contient le nom des items.
function majchamp()
{
	<?php
	// Convertir le tableau $tab_php en tableau tabtype javascript
     	conv_tabjs($tab_php,"num_item_connu");
	?>
	
	<?php
	// Convertir le tableau $tabtype_php en tableau tabtype javascript
     	conv_tabjs($tabtype_php,"tabtype");			
  	?>

	<?php
	// Convertir le tableau $tabcate_php en tableau tabcate javascript
    	conv_tabjs($tabcate_php,"tabcate");
  	?>

 	var chx_lst_item = $idobjet('lst_items_connus').options[$idobjet('lst_items_connus').selectedIndex].text;
	document.forms['frm_ajout_inventaire'].elements['chp_objet'].value=chx_lst_item;

  	for (i=1;i < <?php echo $elem;?>;i++)
	for (t=1;t < <?php echo $elemtype;?>;t++)
	for (z=1;z < <?php echo $elemcate;?>;z++)
   // Trouver l'item pour connaitre le nom, le type et la categorie
	if (num_item_connu[i][1] == chx_lst_item)
	{
		if (num_item_connu[i][2] == tabtype[t][1])
		{
			if (num_item_connu[i][3] == tabcate[z][1])
			{
				//alert(num_item_connu[i][4]);
				document.getElementById('lst_type').selectedIndex=tabtype[t][0];
				document.getElementById('lst_catagorie').selectedIndex=tabcate[z][0];
				
				// textarea
				document.getElementById('id_description').value =num_item_connu[i][4];
			}
		}
	}
}
</script>
En espérant que vous pourrez m'aider, merci d'avance.
Modifié en dernier par zakarum92 le 24 oct. 2007, 18:33, modifié 2 fois.
Que les vents soient avec vous.

ViPHP
ViPHP | 4039 Messages

23 oct. 2007, 22:56

Salut,

Y'a une numero de ligne associée a l'erreur, historie de savoir ou elle pourrait se trouver ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Petit nouveau ! | 6 Messages

23 oct. 2007, 23:46

Bonsoir Berzemus,

Voici l'erreur :

unterminated string literal
num_item_connu[1][4] = 'Dégats a une main\n


Merci de prendre de ton temps pour m'aider.
Que les vents soient avec vous.

Eléphant du PHP | 443 Messages

24 oct. 2007, 00:05

File nous le code source de ta page réçu par le navigateur, on pourra voir ce qui est invalide dans les tableaux javascript générés.


Tracker.

Petit nouveau ! | 6 Messages

24 oct. 2007, 06:23

Bonjour Tracker,

Ci dessous le code soure du navigateur (Firefox).

Merci de ton aide.

Le code source de la page est tronquée dans le post je ne sais pas pourquoi.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link href="banque_scl.css" rel="stylesheet" type="text/css">
<link href="Tableaux.css" rel="stylesheet" type="text/css">
<script src="mesfonc.js" type="text/javascript"></script>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Banque Softcore Ladder des Hypes</title>
</head>
<div class="entete" >
<img  class="entete" src="entete.JPG">
</div>
<div class="colonneGauche" >
<link href="menus.css" rel="stylesheet" type="text/css">
<div class="btn_m_menu"> <a href="#"></a> </div>

<div class="btn_m_deconnexion"> <a href="index.php?page=accueil"></a> </div>
<div class="btn_m_ajouter"> <a href=""></a> </div>
<div class="btn_m_banquier"> <a href="membre.php?page=ajoutbanquier"></a> </div>
<div class="btn_m_compte"> <a href="membre.php?page=ajoutcompte"></a> </div>
<div class="btn_m_objet"> <a href="membre.php?page=ajout_items_inventaire"></a> </div>
<div class="btn_m_gestion"> <a href="#"></a> </div>

<div class="btn_m_banquier"> <a href="membre.php?page=gestion_bqe"></a> </div>
<div class="btn_m_compte"> <a href="membre.php?page=gestion_cpte"></a> </div>
<div class="btn_m_objet_fin"> <a href="membre.php?page=gestion_items"></a> </div>
<div class="colonneDroite">

<script language="JavaScript">
function majchamp()
{
var num_item_connu = new Array(650);
num_item_connu[1] = new Array(10);
num_item_connu[1][0] = '1';
num_item_connu[1]['num_item_connu'] = '1';
num_item_connu[1][1] = 'Acier d\'Astréon';
num_item_connu[1]['nom_item'] = 'Acier d\'Astréon';
num_item_connu[1][2] = 'Sceptre';
num_item_connu[1]['type'] = 'Sceptre';
num_item_connu[1][3] = 'Unique Elite';
num_item_connu[1]['categorie'] = 'Unique Elite';
num_item_connu[1][4] = 'Dégats a une main     // [b]L'erreur se fait sur cette ligne[/b]
Olivier';
num_item_connu[1]['test'] = 'Dégats a une main
Olivier';
num_item_connu[2] = new Array(10);
num_item_connu[2][0] = '2';
num_item_connu[2]['num_item_connu'] = '2';
num_item_connu[2][1] = 'Affres de la douleur';
num_item_connu[2]['nom_item'] = 'Affres de la douleur';
num_item_connu[2][2] = 'Armure';
num_item_connu[2]['type'] = 'Armure';
num_item_connu[2][3] = 'Unique Normal';
num_item_connu[2]['categorie'] = 'Unique Normal';
num_item_connu[2][4] = 'toto';
num_item_connu[2]['test'] = 'toto';
// ...
Que les vents soient avec vous.

Eléphant du PHP | 443 Messages

24 oct. 2007, 07:19

Salut,

Dans le principe, il faut que tu remplaces les sauts lignes (\n) en (\\n) pour qu'ils puissent être interprétés correctement en javascript lors de la création de la chaine:
<?php
function conv_tabjs($tableau, $nomjs, $prempass=true)
{
	if($prempass)
	{
		$taille = count($tableau);
		echo "var ".$nomjs." = new Array(".$taille.");\n";
		foreach($tableau as $key => $val)
		{
			if(is_string($key)) $key = "'".$key."'";
			conv_tabjs($val, $nomjs."[".$key."]", false);
		}
	}
	else
	{
		if(is_array($tableau))
		{
			echo($nomjs." = new Array(".count($tableau).");\n");
			foreach($tableau as $key => $val)
			{
				if(is_string($key)) $key = "'".$key."'";
				conv_tabjs($val, $nomjs."[".$key."]", false);
			}
		}
		else
		{
			// Partie modifiée
			if(is_string($tableau)) 
			{
				$tableau = str_replace(array("\r\n", "\n", "\r"), '\\n', $tableau);
				$tableau = "'".addcslashes($tableau,"'")."'";
			}
			echo($nomjs." = ".$tableau.";\n");
		}
	}
} 
?>
Teste et tiens nous au courant.


Tracker.

Petit nouveau ! | 6 Messages

24 oct. 2007, 08:15

Bonjour Tracker,

Je test ce soir en rentrant là je suis au travail.

Je vous tiens au courant.

Merci encore de ton aide.
Que les vents soient avec vous.

Eléphant du PHP | 443 Messages

24 oct. 2007, 08:55

Sinon tu te prends peu la tête, tu peux faire exactement la même chose avec JSON, cherches des tutos et des librairie php qui gèrent déjà la conversion.

Le principe est le suivant:
<?php
// (littéral/object/tableau) à transmettre au client js.
$mix = ...
?><script>
var o = eval(<?php echo JSON_encode($mix) ?>);
...
</script>

Tracker.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 oct. 2007, 10:37

Modération :
zakarum92, afin d'améliorer la lisibilité de tes messages,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Et si l'erreur a lieu à la ligne 10, il est effectivement interessant
de voir les lignes qui suivent mais pas forcément 300 ;)

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

24 oct. 2007, 18:30

Bonsoir à tous

Tracker :
Ok cela fonctionne à merveille. Merci beaucoup pour ton aide.
Pour Jason je regarde ce Week End.

Ryle
Normalement j'utilise bien les balises
 ou [Code], mais ce matin lorsque j'ai voulu envoyer le message, une erreur c'est produite, on me demandé d'enregistrer ou d'ouvrir  un fichier Posting.php.

Je ferais plus intention la prochaine fois.

En attendant un grand merci.
Que les vents soient avec vous.

Eléphant du PHP | 443 Messages

24 oct. 2007, 19:49

Ok cela fonctionne à merveille. Merci beaucoup pour ton aide.
Pour Jason je regarde ce Week End.
J'aime bien les "Vendredi 13" aussi, mais à moins que tu veuilles faire un week-end vidéo,
recherche plutot des tutos sur JSON :wink:


Tracker.

Petit nouveau ! | 6 Messages

25 oct. 2007, 06:00

Bonjour Tracker,

Oups faute de frappe je commence bien l'apprentissage :oops:

Bonne continuation.
Que les vents soient avec vous.