IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Warning: Call-time pass-by-reference has been deprecated


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de Poseidon62
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 67
    Points
    67
    Par défaut Warning: Call-time pass-by-reference has been deprecated
    Bonjour,

    Lorsque je lance le script php ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <html>
    <head>
      <title>Affichage de données issues d'une base oracle</title>
     
    <style type="text/css" media="screen"><!--
      #calquevert { background-color: #00ff99; visibility: visible; position: absolute; top: 55px; left: 100px; width: 800px; height: 200px }
      #calquebleu { background-color: #0000ff; visibility: visible; position: absolute; top: 25px; left: 100px; width: 800px; height: 25px }
    --></style>
     
    <?
     
    include 'log_bdr.php';
     
    if (($db=="") or ($user=="") or ($pass=="") or ($nom_table=="")) {
    	$message = "Paramètres incorrects<br>";
    	exit();
    	}
     
    //---Connexion ---//
    $oci_conn = @ocilogon($user, $pass, $db);
    	if (!$oci_conn) {echo "L'utilisateur $user n'a pas pu se connecter à la base $base";
    	} else {
     
    	//-----Le Select ---//
            $nape = $_POST['ape'];                   // récupération variable ape du formulaire
            //----- ATTENTION - la syntaxe ....CODE_APE='".$nape."'"; - '.....' est due au type de données VARCHAR2 -----//
    	$select = "select * from ".$nom_table." where LIB_APE LIKE '%".$nape."%'";    // requête de sélection d'enregistrements
    	$ordre = ociparse ($oci_conn, $select);  // vérification de la requête
     
                     ociexecute ($ordre);            // Exécution de la requête
     
    	$nb_champs = ocinumcols($ordre);
            }
     
    	//----- Affichage des entêtes ---//
    	//print "<h1>Contenu de la table $nom_table</h1>";  //<table border=1><tr>";
            print "<div id='calquebleu'>";
            print "<font color=yellow><b>Votre recherche -> ".$nape."</b></font>\r\n";
            print "</div>";
    		/*for($i = 1; $i <= $nb_champs; $i++) {
    		  print "<th>".ocicolumnname($ordre, $i)."</th>";
    	          }*/
    	print "</tr>";
     
    	//----- Affichage des lignes -----//
                  print '<div id="calquevert">';
     
    		while(ocifetchinto($ordre, &$enregistrement, OCI_NUM)) {
     
     //	             print "<tr>";
     //			for($champ = 0; $champ < $nb_champs; $champ++) {
     			  print "<font color=blue><b>".$enregistrement[0]." ".$enregistrement[1]."</b>&nbsp;</font><br>";
     //                         }
     //                         print "</tr>";
                              }
                  print '</div>';
     
     //       print "</table>";
     
                    //----- Libération des ressources -----//
    		ocifreecursor($ordre);
     //		ocifreestatement($ordre);
    		ocilogoff($oci_conn);
    //		}
    ?>
    j'ai le message ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in c:\program files\easyphp1-8\www\aff_donn4.php on line 48
    Quelqu'un a t-il une idée sur ce qui provoque cette erreur ?
    Le script fonctionnait bien avant que je migre mon EasyPHP 1.6 vers EasyPHP 1.8

    Merci pour votre aide

  2. #2
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    La ligne 48 doit être cette ligne :

    while(ocifetchinto($ordre, &$enregistrement, OCI_NUM)) {

    Le passage par référence n'est plus possible dans ta version. Pour continuer a passer par référence, il faut modifier le prototype de ta fonction. Ou bien tu peux changer un paramêtre de ton php.ini.

    Mais bon, dans l'ensemble le message d'erreur t'avais déjà tout dit. Il ne faut pas négliger les messages d'erreur PHP ^^

  3. #3
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    je suppose que la ligne 48 est celle ci :
    while(ocifetchinto($ordre, &$enregistrement, OCI_NUM)) {
    Et donc, comme indiqué clairement dans le message d'erreur (en anglais par contre) : le passage par référence lors de l'appel de la fonction est "déprécié" depuis un petit moment déjà (je ne sais plus quelle version... désolé).

    La solution ? Enlever le "&".


    Les parametres passés par références doivent être déclarés dans le prototype de la fonction.



    PS : si vraiment tu tiens à conserver ce genre de vieux code, tu peux modifier le paramêtre correspondant dans le fichier php.ini ; ainsi l'erreur ne s'affichera plus.


    EDIT : arf Hugo... post croisé...
    Google is watching you !

  4. #4
    Membre du Club Avatar de Poseidon62
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 67
    Points
    67
    Par défaut
    Merci pour vos réponses, mais

    Je n'ai pas négligé le message - j'ai vérifié dans PHP.ini.
    J'ai installé EasyPHP sur mon disque dur et également en réseau local.
    J'avais modifié le fichier réseau local mais pas celui de mon HD.

    J'étais un peu distrait !!!

    Désolé, on ne pense pas toujours à tout au bon moment

    Merci quand même pour votre aide

  5. #5
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    mmm tu as donc choisi de modifier le php.ini ?
    Pas très prudent... rien ne dit que dans de futures version (PHP 5.1 ? voir peut être même PHP 5.0) ceci soit complètement interdit.
    Google is watching you !

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut demande d'info sur le même sujet
    bonjour à tous

    comme j'ai lu tout ce fil de discussion sur ce post , peut-être l'un de vous saura m'éclairer :



    j'ai aussi le message :Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). etc etc


    donc au lieu de changer le php.ini puisque kioob semblait pas préconiser cela j'ai oté le & dans mon fichier sur la variable &$children dans :

    c:\program files\easyphp1.8\www\joomla1.5b2\plugins\system\legacy\functions.php on line 842

    ce qui donne donc:

    function mosTreeRecurse( $id, $indent, $list, $children, $maxlevel=9999, $level=0, $type=1 )
    {
    jimport('joomla.html.html');
    JHTML::_('menu.treerecurse', $id, $indent, $list, $children, $maxlevel=9999, $level=0, $type=1);
    }

    mes questions (merci pour la patience de lire ;-)

    1/A quoi sert cette fonction si elle vous parle ? je suis zéro en developpement, hélas

    2/Qu'est ce que cela change d'enlever ce & , cela marchera quand même ?

    3/Si je mets mon site en ligne (la il est en local avec easyphp 1.8 et joomla 1.5) cela change t'il quelque chose ?


    Merci à tous.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Kioob Voir le message
    je suppose que la ligne 48 est celle ci :


    Et donc, comme indiqué clairement dans le message d'erreur (en anglais par contre) : le passage par référence lors de l'appel de la fonction est "déprécié" depuis un petit moment déjà (je ne sais plus quelle version... désolé).

    La solution ? Enlever le "&".

    Les paramètres passés par références doivent être déclarés dans le prototype de la fonction.
    Bonjour,

    Bien qu'ayant déjà développé en PHP, je ne saisis pas cette notion de prototype de la fonction. Avez-vous un exemple explicite caractérisant cette notion?

    Est-il nécessaire de déclarer les paramètres passés par références dans le prototype de la fonction? Enlever le "&" ne suffit-il pas?

    Merci pour votre retour.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    up

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Points : 12
    Points
    12
    Par défaut Passage par référence
    Pour effectuer un passage par référence on écrit à présent ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function foo(&$var)
    {
        $var++;
    }
     
    $a=5;
    foo($a);
    // $a is 6 here
    Donc le "&" est à mettre du côté de la signature de la fonction (Kioob appelait cela le prototype), et pas du côté appelant.
    Dans de vieux code source tu peux avoir le contraire ce qui provoque un warning.
    Donc pour être à jour : enlever le "&" côté appel et le mettre côté "function(...)".

    Plus d'info sur:
    http://fr.php.net/language.references.pass

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 11/04/2014, 09h44
  2. Réponses: 10
    Dernier message: 21/02/2014, 13h39
  3. Erreur A circular control reference has been made.
    Par staticx dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/01/2013, 14h31
  4. cannot reference this before supertype constructor has been called
    Par renlel dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 26/11/2009, 14h25
  5. Classe JDialog + cannot reference parent before supertype constructor has been called
    Par une_tite_question dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 08/04/2008, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo