5 votes

une fonction php à l'intérieur d'une requête mysql ?

J'ai cette requête

$query = "INSERT INTO $new_db.wp_users (user_login, user_pass, user_nicename)
select user_email, md5(user_password), user_name from $source_db.users";

et j'ai cette fonction

function wp_hash_password($password) {
    require_once('class-phpass.php');
    // By default, use the portable hash from phpass
    $wp_hasher = new PasswordHash(8, TRUE);
    return $wp_hasher->HashPassword($password);
}

J'ai besoin que la requête soit comme ceci

$query = "INSERT INTO $new_db.wp_users (user_login, user_pass, user_nicename)
select user_email, ". wp_hash_password(user_password) .", user_name from $source_db.users";

mais cela ne fonctionne pas...des idées ?

5voto

bensiu Points 6306

Vous avez 2 options :

  • réécrire la fonction wp_hash_password en SQL/PL et l'utiliser dans les requêtes
  • charger le résultat en PHP - le modifier et le renvoyer avec un code comme celui-ci :

    $results = mysql_query ( "SELECT user_login, user_pass, user_nicename FROM $source_db.users" );

    while ($row = mysql_fetch_assoc($results)) { $sql = "$query = "INSERT INTO $new_db.wp_users (user_login, user_pass, user_nicename) VALUES ( "; $sql .= $row['user_login'] . ','; $sql .= wp_hash_password($row['user_password']) . ','; $sql .= $row['user_nicename; $sql .= ' ) '; mysql_query ( $sql ); }

2voto

Jonah Points 5434

Vous devez diviser votre requête en deux requêtes. Exécutez la requête SELECT d'abord, exécutez votre fonction sur la colonne appropriée dans les données que vous avez obtenues, puis exécutez la requête INSERT la dernière requête.

Notez que vous devrez effectuer cette opération une ligne à la fois (ou peut-être par morceaux) dans une boucle ; vous ne voulez pas charger la table entière en mémoire.

2voto

Peter Bailey Points 62125

Vous ne pouvez pas. MySQL ne peut pas communiquer avec PHP de cette façon. Seules les fonctions MySQL sont valides.

Vous devrez écrire un script PHP qui fait cela avec itération.

1voto

coreyward Points 26109

Mise à jour : Je crois que j'ai mal compris ce que vous vouliez faire (merci à Peter Bailey de l'avoir signalé).

Vous devez mettre le résultat de cet appel de fonction entre guillemets simples lorsqu'il est inséré dans votre requête afin qu'il soit interprété comme une chaîne de caractères dans votre requête, et non comme une référence à une colonne :

$query = "INSERT INTO $new_db.wp_users (user_login, user_pass, user_nicename)
select user_email, '" . wp_hash_password($user_password) . "', user_name from $source_db.users";

1voto

Sakthikanth Points 59

J'ai créé une fonction php simple pour utiliser les requêtes MySQL.

Toute requête peut être exécutée en une seule fonction simple.

Dans le cas d'une requête de sélection, Nous pouvons obtenir les arguments sélectionnés car le nom de la variable contient la valeur de l'argument sélectionné.

Par exemple :

<?php

q("select user_name,email_id from users where user_id=48");

   echo $user_name;   echo "<br>";
   echo $email_id;
?>

ou vous pouvez définir votre propre nom de variable en mettant " comme ".

<?php

q("select user_name as uname, email_id as email from users where user_id=48");

   echo $uname;    echo "<br>";
   echo $email;
?>

Le résultat sera :

  someuser
  someemail

Si un plus grand nombre de lignes a été sélectionné, le nom de la variable sera créé sous forme de tableau. pour ex :

<?php

      q("select user_name,user_id from users");

      for($n=0;$n<count($user_name);$n++)
      {

            if(count($user_name)==1)  // if single row is selected
            {

                $username_val=$user_name;
                $user_ids=$user_id;

            }else{
                $username_val=$user_name[$n]; // for multiple rows selected

               $user_ids=$user_id[$n];
            }

             echo $username;

      }

?>

ou vous pouvez définir votre propre nom de variable en mettant " comme ".

<?php

      q("select user_name as un,user_id as uid from users");

      for($n=0;$n<count($user_name);$n++)
      {

            if(count($user_name)==1)  // if single row is selected
            {

                $username_val=$un;
                $user_ids=$uid;

            }else{
                $username_val=$un[$n]; // for multiple rows selected
                 $user_ids=$uid[$n];
            }

             echo $username_val; echo " "; 
             echo $user_ids; echo "<br>";

      }

?>

Le résultat sera : (Si la table de l'utilisateur a trois rangées)

User1 4043
User2 4048
User3 4056

Créer le fichier de connexion mysql ex : mysql_connect_file.php

<?php

$dbc=new mysqli('localhost', 'my_user', 'my_password', 'my_db');

?>

La fonction php est la suivante

<?php

   require_once './mysql_connect_file.php';
function q($q)
       {

    $main_q=$q;
    $q=  strtolower($q);
      global $dbc;

              $temp=$q;
              $temp=str_replace(" ", "", $temp);
              $temp=  strtolower($temp);
         $temp=".$temp";
              if(strpos($temp, "update")==1 || strpos($temp, "insert")==1 || strpos($temp, "delete")==1 || strpos($temp, "alter")==1 || strpos($temp, "create")==1)
              {
                  $rd2=  mysqli_query($dbc,$main_q);
                  if($rd2)
                  {
                      return TRUE;
                  }
                  else{

       $mysql_err=  mysqli_error($dbc);

              $err=  debug_backtrace();
              $err_line=$err[0]['line'];
              $err_file=$err[0]['file'];
        echo  "<font color='black'>Error at <b>$err_file on line $err_line  </b>query --></font><font color='maroon'>$main_q</font> (<font color='red'> $mysql_err </font> )";

        return FALSE;

                  }

              }elseif(strpos($temp, "select")==1){

     $qn=  str_replace("select ", "", $q);

     $qn=substr($qn,0,  strpos($qn, " from"));
     $qn="$qn,";

       $selc=  str_replace("`","", $qn);
       $qn=  str_replace("`","", $qn);
       $my_var=array();

      $my_nm=array();
       for($m=1;$m<=substr_count($selc, ',');$m++)
       {
              $my_nm[$m]=substr($qn,0,  strpos($qn, ","));

              $qn=substr($qn,strpos($qn, ",")+1, strlen($qn));
              if(strpos($my_nm[$m]," as ")>0)
              {
      $my_var[$m]=  str_replace(" as ", "~", $my_nm[$m]);
      $my_var[$m]=  str_replace(" ", "", $my_var[$m]);

      $my_var[$m]=substr($my_var[$m],strpos($my_var[$m],"~")+1,strlen($my_var[$m]));
              }else
              {
  $my_var[$m]=substr($my_nm[$m],0,  strlen($my_nm[$m]));  
  $my_var[$m]=  str_replace(" ","", $my_var[$m]);
              }

       }

       $rn=mysqli_query($dbc, $main_q);

       if($rn)
      {

              if(mysqli_num_rows($rn)>0)
              {       

               for($t=1;$t<=count($my_var);$t++)
             {

          $$my_var[$t]=array();

             }

    while($row=mysqli_fetch_array($rn,MYSQLI_ASSOC))
    {

           if(mysqli_num_rows($rn)>1)
           {

              for($t=1;$t<=count($my_var);$t++)
             {

             ${$my_var[$t]}[]=$row[$my_var[$t]];
    }

     }else{

             for($t=1;$t<=count($my_var);$t++)
             {
    $$my_var[$t]=$row[$my_var[$t]];

             }

           }
    }

  if(mysqli_num_rows($rn)>1)
  {
     for($t=1;$t<=count($my_var);$t++)
             {
     $GLOBALS[$my_var[$t]]= sel_mr($my_var,$$my_var[$t]);

             }   

             for($t=1;$t<=count($my_var);$t++)
             {
     return $$my_var[$t];

             }
  }
  if(mysqli_num_rows($rn)==1)
  {

              for($t=1;$t<=count($my_var);$t++)
             {
     $GLOBALS[$my_var[$t]]=$$my_var[$t];

             }
             for($t=1;$t<=count($my_var);$t++)
             {
     return $$my_var[$t];

             }

  }

              }else
              {

       for($t=1;$t<=count($my_var);$t++)
             {
     $GLOBALS[$my_var[$t]]=NULL;

             }

             for($t=1;$t<=count($my_var);$t++)
             {
     return $my_var[$t];

             }

              }

      }else
      {

             for($t=1;$t<=count($my_var);$t++)
             {
     $my=  mysqli_error($dbc);
     if($t==1)
     {
            $err=  debug_backtrace();
            $err_line=$err[0]['line'];
            $err_file=$err[0]['file'];
      echo  "<font color='#ef0000'>Error at <b>$err_file on line $err_line  </b>query --></font><font color='maroon'>$q</font> (<font color='red'> $my </font> )";

     }

             }

             for($t=1;$t<=count($my_var);$t++)
             {
     for($p=0;$p<count($$my_var[$t]);$p++)
     {
            $a=$$my_var[$t];
            return $a;    
     }

             }

      }
              }

       }
     function sel_mr($a,$ab)
     {
            for($t=1;$t<=count($a);$t++)
            {
      foreach ($ab as $my)
      {

             ${$a[$t]}[]=$my;

      }
            }

            for($t=1;$t<=count($a);$t++)
            { 
      return $$a[$t];
            }

     } 

?>

Notes :

Vous pouvez enregistrer ce code dans un fichier, puis appeler cette fonction en incluant le nom du fichier.

par ex : si votre fichier s'appelle q.php ( --> contient la fonction q ) alors vous pouvez utiliser le code pour d'autres fichiers en incluant

<?php

include 'q.php';

  q("select user_name from users where user_id=4048");
   echo $user_name; 
?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X