2011-01-20 6 views
4

어떤 아이디어mysql 쿼리에 PHP 함수가 있습니까?

... 나는이 쿼리

$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"; 

을하고 난

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); 
} 

내가이

$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"; 

처럼되고 쿼리를 필요로이 기능을 가지고 있지만, 이것은 실패

+3

모든 사용자에게 동일한 비밀번호를 설정하려는 경우 핵심어가 올바른 것입니다. 'user_password'가 db 컬럼이고 한번에 여러 행을 조작하려고한다면, Peter와 Jonah는 정확합니다. –

답변

4

당신은이 옵션을 가지고 : SQL/PL에

  • 재 작성 wp_hash_password 기능과 PHP에 쿼리에
  • 부하 결과를 사용 - 수정 같은 코드로 다시 보내 :
 
$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); 
} 
+0

저장 프로 시저는 실제로 이식 할 수 없습니다. – Jonah

+0

이식성이 요구 사항으로 명시된 문장을 놓쳤습니까? 심지어 WordPress 데이터베이스처럼 보입니다. 원시 저장 procs는 완벽하게 실행 가능하다고 생각합니다. 특히 일회성 마이그레이션 작업처럼 보입니다. –

+0

@Peter Bailey : 좋은 지적입니다. 코드가 클래스를로드 할 때 여전히 실행 가능하지 않을 수 있습니다. 잠재적으로 많은 코드를 포팅해야합니다. 그러나 옵션으로 제시 할 때 아무런 해가 없다고 생각합니다. – Jonah

1

업데이트 : 나는 nk 나는 당신이하려고했던 것을 오해했습니다 (Peter Bailey가 그것을 지적했기 때문에).

$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"; 
+2

아니요, 그가 요구하는 것이 아닙니다. 그는 MySQL이 그 함수를 사용하여 쿼리를 작성하지 않고 PHP 함수를 사용하여 컬럼을 선택하기를 원합니다. –

2

:이 쿼리에 삽입 될 때이 열에 대한 참조 쿼리 문자열로 해석하고, 아니에요 있도록

당신은 작은 따옴표로 그 함수 호출의 결과를 포장 할 필요가 쿼리를 두 개의 쿼리로 분할해야합니다. 처음에는 SELECT 쿼리를 실행하고 데이터의 해당 열에서 함수를 실행 한 다음 INSERT 쿼리를 마지막으로 실행하십시오.

루프에서 한 번에 한 행씩 (또는 청크로) 수행해야합니다. 전체 테이블을 메모리에로드하고 싶지는 않습니다.

+1

이것은 너무 실행 가능하지만 데이터 크기가 너무 크면 메모리가 부족합니다. 나는 이것을 개인적으로 메모리 라이트 방식으로 반복하고 반복한다. 더 많은 시간이 걸릴 수도 있지만 필요할 수도있다. –

+0

오, 나는 그가 전체 테이블을하고 있었다는 것을 이해하지 못했습니다. 편집 중 ... – Jonah

2

수 없습니다. MySQL은 그런 식으로 PHP와 다시 통신 할 수 없습니다. MySQL 기능 만 유효합니다.

반복과 함께 PHP 스크립트를 작성해야합니다.

1

MySQL 쿼리를 사용하는 간단한 PHP 함수를 만들었습니다.

모든 쿼리는 1 개의 간단한 함수로 실행할 수 있습니다.

select 쿼리의 경우 선택한 인수는 선택한 인수 값을 포함하는 변수 이름으로 가져올 수 있습니다.

someuser 
    someemail 

: 당신이

<?php 

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



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

결과 출력이 될 것 "으로"넣어 자신의 변수 이름을 설정할 수 있습니다

<?php 

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



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

또는 : 예를 들어

더 많은 행 수가 s 당신이

<?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>"; 

     } 

?> 

결과 출력이 될 것 "으로"넣어 자신의 변수 이름을 설정할 수 있습니다

<?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; 

     } 

?> 

나 : 선출, 변수 이름은 배열 전직에 대한 으로 생성됩니다 : (사용자 테이블에 3 행이있는 경우)

User1 4043 
User2 4048 
User3 4056 

mysql 연결 만들기 파일 예 : mysql_connect_file.php는

<?php 

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

?> 

PHP 함수는

<?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]; 
      } 


    } 

?> 

주 이하 :

당신은 다음을 포함하여이 함수를 호출 할 수있는 파일에이 코드를 저장할 수 있습니다 해당 파일 이름

예 : 파일 이름이 q.php 인 경우 (-> contains q function) 다음을 포함하여 다른 파일의 코드를 사용할 수 있습니다.

<?php 

include 'q.php'; 

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