8710 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

Je vous dis tout : J'ai un site écrit pour php 3 ou 4 qui date d'il y a 10 ans. Je le fais modernisé actuellement mais pour des raisons d'échéance et de fonction FTP bridée chez Amen, il faut que je le migre avant le 19/11 chez un hébergeur dont les serveurs sont en php 5.3.

Pas mal de mes fonction php doivent être ré-écrite pour pouvoir fonctionné, des fois je trouve dans le guide PHP mais là par exemple je bloque. Je vous précise que le site devant être refait prochainement, je cherche la modif minimale pour ne pas avoir d'intérruption de service, pas la requète la plus optimiser et je veux ensuite pouvoir faire un rechercher /remplacer sur la fonction à réécrire pour moderniser les pages


Dans le code ci-dessous j'ai reussi à débogué le script jusqu'à

$SOCIETE=mysql_result($requete,$index,"SOCIETE");


Comment dois-je réécrire mysql_result pour indexer mes variables avec mes champs de retour SVP
// CONNEXION MYSQL
$db_link = mysqli_connect($sql_serveur,$sql_user,$sql_passwd,$sql_bdd);
if(!$db_link) {echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Vérifiez les paramètres du fichier conf.php3"; exit;}
// syntax = mysqli_connect("myhost","myuser","mypassw","mybd")

//RECUPERATION DES COORDONNEES DU LOUEUR

$requet = "SELECT * FROM profils WHERE ID=44 $Ses_id";
print ($requet);
// SELECTION DE L'ENREGISTREMENT CONTENANT L'ID EN COURS
$requete=mysqli_query($db_link,$requet) or die(mysqli_error());
//print ($requete);
$DataReturn = 0;
$DataReturn = mysqli_num_rows($requete);
print ("$DataReturn réponses de source 1\n");

if( $DataReturn  > 0)
	{
	$PROPID=mysql_result($requete,$index,"ID");

	$SOCIETE=mysql_result($requete,$index,"SOCIETE");
	$NOM=mysql_result($requete,$index,"NOM");
	$PRENOM=mysql_result($requete,$index,"PRENOM");
	$ADRESSE=mysql_result($requete,$index,"ADRESSE");
	$CP=mysql_result($requete,$index,"CP");
Comme je suppose qu'il n'y a qu'un jeu de valeurs (la recherche se faisant avec un where id=), je te propose cette alternative :

$array=mysqli_fetch_assoc($requete);
foreach($array as $k=>$value)
{
    if('ID'!=$k){$$k=$value;}
    else {$PROPID=$value}
}


Je pense que mysql_result est une des rares fonctions mysql_ sans équivalent direct ^^
Modifié par Lothindil (30 Oct 2013 - 11:54)
aie aie aie
tu n'aurais rien de plus proche de ma syntaxe actuelle parce que si là je n'ai qu'un retour
dans d'autre page mysql_result me ramène un array

et là ta proposition interdit le rechercher/remplacer dans toutes les pages, il faut réécrire tout le site!! j'ai des dizaines et des dizaines de pages construites ainsi

en fait je cherche la syntaxe qui permettra de remplacer mysl_result en associant, variable à retour de champs
Dans le morceau de code que tu nous a fournis, mysql_result() ne retourne pas un tableau, mais une série de variables :

$PROPID=mysql_result($requete,$index,"ID");

	$SOCIETE=mysql_result($requete,$index,"SOCIETE");
	$NOM=mysql_result($requete,$index,"NOM");
	$PRENOM=mysql_result($requete,$index,"PRENOM");
	$ADRESSE=mysql_result($requete,$index,"ADRESSE");
	$CP=mysql_result($requete,$index,"CP");


Mon code te sort exactement les mêmes variables écrites d'une manière plus légère. Mais si tu préfères la version "remplacement", ça va donner :

$array=mysqli_fetch_assoc($requete);
$PROPID=$array["ID"];
$SOCIETE=$array["SOCIETE"];
$NOM=$array["NOM"];
$PRENOM=$array["PRENOM"];
$ADRESSE=$array["ADRESSE"];
$CP=$array["CP"];


Ce qui revient à rajouter une ligne : $array=mysqli_fetch_assoc($requete);

puis à remplacer
mysql_result($requete,$index,
par
$array[
et
");
par
"];
Bon alors ça marche pour la partie 1 réponse de la table

mais quand j'ai n lignes de table en retour j'avais ça

$requete=mysqli_query($db_link,"SELECT * FROM annonces where PROPID=$Ses_id") or die(mysqli_error());


$DataReturn = 0;
$DataReturn = mysqli_num_rows($requete);

if( $DataReturn  > 0)
   {
   for ($index=0; $index< $DataReturn; $index++)
       {
		$PHOTO1=$array["PHOTO1"];
		$IMMOID=$array["IMMOID"];
		$TYPLOU=$array["TYPLOU"];
		$CATTYPLOU =$array["CATTYPLOU"];
		$ADRESSE =$array["ADRESSE"];
		$LOCCP =$array["CP"];
	


Instinctivement, je dirais que ton
$array=mysqli_fetch_assoc($requete);

remplace toute l'indexation
$DataReturn = 0;
$DataReturn = mysqli_num_rows($requete);

if( $DataReturn  > 0)
   {
   for ($index=0; $index< $DataReturn; $index++)
       {


Je vais tenter mais si je me plante dis le moi STP je gagnerai du temps, il y a vraiment toute la syntaxe à reprendre!!!
C"était pas ça mais je me suis corrigé et en plaçant

 $array=mysqli_fetch_assoc($requete);


après ouverture de l'indexation ça marche
Tu peux remplacer :

 for ($index=0; $index< $DataReturn; $index++)
{ 
      $array=mysqli_fetch_assoc($requete);
}


Par
while($array=mysqli_fetch_assoc($ressource))
{

}


Le for servant à parcourir tous les index pour aller chercher ensuite avec mysql_result le résultat propre à la ligne couverte par "$index". $index étant un chiffre allant de 0 à un maximum (qui est la dernière ligne), ça parcourt en réalité les résultats dans l'ordre du select.

Mon while parcourt l'intégralité des résultats un par un, dans l'ordre du select.

Plus propre, plus rapide ^^

Ca peut remplacer aussi le mysqli_num_rows>0, le $array retournant false s'il n'y a pas de résultat. Mais je préfère personnellement garder le test du nombre de ligne, permettant de renvoyer une erreur personnalisée de type "Votre recherche ne donne aucun résultat", ce que ne permet pas directement le while.

Au passage tu peux alléger ces lignes :
$DataReturn = 0;
$DataReturn = mysqli_num_rows($requete);

if( $DataReturn  > 0){


par :
if( mysqli_num_rows($requete) > 0){


Vu que tu n'as plus besoin de réutiliser $DataReturn. (à moins, bien sûr que tu aies besoin de $DataReturn ailleurs^^)
Modifié par Lothindil (30 Oct 2013 - 22:37)
Merci de ton aide précieuse
je vais en abuser en te demandant la syntaxe pour changer de conf de connexion et de base selon que je suis sur

racine 127.0.0.1
ou
serveur de prod tartempion.com

dans mon conf.php
T'abuses un peu (ou pas ^^)

switch($_SERVER['SERVER_NAME'])
{
      case "tartempion.com":
            $host= "/*ip de l'host*/";
            $user= "/*user*/";
            $pass= "/*pass*/";
            $db="/*db*/";
      break;

      case "localhost":
            $host= "127.0.0.1";
  	$user="/*user*/";
  	$pass="/*pass*/";
            $db="/*db*/";
      break;
  }
$link = mysqli_connect($host,$user,$pass,$db) or die("Error " . mysqli_error($link));


Voilà... C'est pas bien compliqué à faire ^^
Merci beaucoup,
rien n'est compliqué quand tu pratiques régulièrement, mais moi j'apprends tout au fur et à mesure !!!

Je m'y remets juste maintenant.
J'ai appris aussi au fur et à mesure ^^ mais c'est sûr que plus on pratique, plus ça paraît simple ^^ (et généralement on cherche à réinventer la roue à cause d'une variable ou d'une fonction qu'on ne connaît pas^^)
Bon j'ai encore ça qui est obsolète

if (!session_is_registered('Ses_id'))

mon script d'ouverture de session est le suivant (j'ai deja modernisé 2 ou trois variables avec la doc php mais dans ce truc j'ai un "!" qui inverse le sens je crois et j'avoue que je chauffe du cabochon pour réécrire ça

<?php $vdebug = 0;
//error_reporting(E_ALL);
    //cookie
     $CoPseudo =$_COOKIE["lefPseudo"]; 
     $CoPass =$_COOKIE["lefPass"];
if ($vdebug==1) {echo ("M $CoPseudo - $CoPass ");}

   if ( ($CoPseudo != "") && ($CoPass != "") )
     {
      $aig = 1;    ///les cookies sont recupérés on peut aller verifier
      $Pseudo = $CoPseudo ;
      $Pass = $CoPass;
      $fpseudo_membre = $Pseudo;
      $fpasse_membre = $Pass;
if ($vdebug==1) { echo ("cookies trouvé : $CoPseudo - $CoPass ");}
     }
   else         //macaron pas gateau - pas de cookies, on cherche dans la session
     {
     	   
	     if (!session_is_registered('Ses_id'))
       
       	  {
	  	  $aig = 0;
      	  //echo "membre anonyme";
              }
       
           else
              {
if ($vdebug==1) {
echo "session ouverte : $Ses_pseudo_membre";
echo "membre : $pseudo_membre en cours";
}

              $aig = 1; // le cookie n'a pas ete trouvé, mais la session est ok. on recupere les infos pour la verif
              //echo "membre : $pseudo_membre en cours";
              //$Pseudo = $pseudo_membre;
              //$Pass = $pass_membre;
              $fpseudo_membre = $Ses_pseudo_membre;
              $fpasse_membre = $Ses_pseudo_pass;

            }
    session_write_close();  
     }
if ($vdebug==1) {
echo "membre : $fpseudo_membre($fpasse_membre)";
echo "AIG : $aig";
}
if ($aig==1)  
   {
//on a trouvé une variabe de sessio ou un cookie
include ("conf.php");

$db_link = mysqli_connect($sql_serveur,$sql_user,$sql_passwd,$sql_bdd);

if(!$db_link) {echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Vérifiez les paramètres du fichier conf.php3"; exit;}

// SELECTION DE L'ENREGISTREMENT CONTENANT L'ID EN COURS
$requete=mysqli_select_db($db_link,"SELECT * FROM profils where LOGIN='$fpseudo_membre' AND PASSWORD='$fpasse_membre' AND ACTIVE=1 AND ADMACTIVE=1") or die(mysql_error());

if(mysql_num_rows($requete)> 0)   //les variables trouvées son correctes dans la base

    {
        session_start();         
        session_unset();
        //echo $id_membre;
        //echo $pseudo_membre;
        //echo $pseudo_pass;
   //Si il existe au moins un enregistrement on redirige sur la page demandée. 

        $Ses_id=$array["ID"];
        $Ses_pseudo_membre=$array["LOGIN"];
        $Ses_pseudo_pass=$array["PASSWORD"];
   // CHAMPS SUPLEMENTAIRES
   // Si vous avez ajouté des champs dans la table SQL, inspirez-vous de la ligne précédente pour récupérer leur valeur. Exemple :
        $Ses_email=$array["Email"];
        $Ses_ville=$array["VILLE"];
        $Ses_societe=$array["Societe"];
        $Ses_nom=$array["Nom"];
        $Ses_prenom=$array["Prenom"];
        $Ses_cp=$array["CP"];
      
        //session_register(id_membre); 
        session_register(Ses_id);
        session_register(Ses_pseudo_membre); 
        session_register(Ses_pseudo_pass); 
        session_register(Ses_email); 
        session_register(Ses_ville); 
        session_register(Ses_societe); 
        session_register(Ses_nom); 
        session_register(Ses_prenom);
        session_write_close();
        setcookie("lefPseudo",$Ses_pseudo_membre,time()+86400*365); 
        setcookie("lefPass",$Ses_pseudo_pass,time()+86400*365); 
     }
    else
        { 
        //Sinon on redirige sur la page d'enregistrement 
if ($vdebug==1) {
        echo ("login : ");
        echo ($fpasse_membre);
        echo ("pass : ");
        echo ($fpasse_membre);
}
       // echo "<script language='JavaScript'> 
      //  document.location.replace('errlog.php'); 
       // </script>"; 
    	  } 
}    
?> 
De base, je testerais simplement si la variable $_SESSION existe, ce qui donnerait :

if(!isset($_SESSION))
{
   //si y a pas de session
}
else
{
  //si y en a une
}


Au passage, fais gaffe, t'as au moins un mysql_num_rows qui traîne plus bas^^
ça m'agace :

Mon
$db_link =mysqli_connect(127.0.0.1,root,,louerenf_cm203548) ;
apparemment fonctionne

Mon
$requet =" SELECT * FROM annonces WHERE ADMVISIBLE=0 AND VISIBLE=0 AND ORDER BY DATEMAJ DESC" ;

me donnent ensembles

$requete=mysqli_select_db($db_link, $requet) or die(mysqli_error());

et resultat =>

Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC11\data\localweb\locations-de-vacances\toutes-les-locations.php on line 479

Quand je fait un print de $requet j'ai ça est-ce que les commandes mysql sont à jour ?

SELECT * FROM annonces WHERE ADMVISIBLE=0 AND VISIBLE=0 AND ORDER BY DATEMAJ DESC

Je vais laisser tomber pour aujourd'hui mais si tu as la réponse rapide, ça me calmera.
Dans tous les cas merci et à bientôt
Dans l'erreur, il parle de mysqli_error(), pas de mysqli_select_db

$requete=mysqli_select_db($db_link, $requet) or die(mysqli_error($db_link));



Au passage, tu cherches à faire quoi avec ton mysqli_select_db() contenant une requête à l'intérieur ?

mysqli_select_db() permet de sélectionner une base de données par défaut, ce que tu sembles (si j'interprète bien tes virgules) avoir fait dans le mysqli_connect().
En pratique, mysqli_select_db() permet de changer de base de données en courant d'une connexion.

Ca serait pas plutôt un mysqli_query() qu'il te faudrait ? (idée de résoudre ton select)
Tu veux dire que c'est la connexion qui flanche ?

Effectivement ce doit pas e^tre la bonne function : je dois récupérer des lignes d'une bases d'annonces pour ensuite associer champs et variables pour editer une page de liste

Je nage !!

Si je ne reponds pas ensuite c'est que ma copine sera arrivée ! Smiley cligne
Donc tu lances une requête ^^ c'est bien mysqli_query qu'il faut utiliser^^

Et non, ta connexion flanche pas, mais le n° d'erreur est associé à la connexion, et donc la fonction mysqli_error() requiert un paramètre, qui est ton témoin de connexion ($db_link).

Ce qui fait qu'une fois corrigé, ta ligne donne :

$ressource=$mysqli_query($db_link,$requete) or die (mysqli_error($db_link));
Bonsoir,
Quelques nouvelles du front

J'ai pas mal avancé grâce aux conseils que tu m'as donnés car ce sont les mêmes erreurs qui se répètent dans tout le site.

En plus, comme j'ai eu une panne de connexion internet (vive la campagne) j'ai été obligé de travailler en local sans distraction extérieur

Simplement quand j'ai fini de débuguer tous les warning, il me reste quelque dizaines (cinquantaines) de =>

Notice: Undefined variable:

Est-ce que c'est très grave, un peu grave, pas grave ?

Sachant que des que je coupe le E_error all, on voit plus rien et que je te rappelle que c'est du provisoire avant remplacement d'ici 2 ou 3 mois

D'ailleurs, ça sert à quelque chose de déclarer les variables en début de page ?

Merci, à bientôt
Cezig
Ca améliore les performances en terme de mémoire de déclarer les variables avant de les utiliser (ça permet de savoir au serveur qu'il y aura x variables et donc x places de mémoires à prévoir).

Mais non, c'est pas capital, comme dit, c'est qu'une "notice", pas un warning. Mais c'est une erreur à corriger pour la refonte ^^
Pages :