2017-05-18 5 views
-1

私は、PostgreSQLデータベース内でいくつかの異なるデータセットをブレンドするプロジェクトに取り組んでいます。私はまだPHP開発とスクリプト作成の初心者だと考えています。配列内のアポストロフィをエスケープするのには本当に問題があります。私はこれらのフォーラムからいくつかのソリューションを試しました:An escaped apostrophe in associative array valueReplace apostrophe in a dynamically created insert statementhttp://www.codingforums.com/php/296075-array_walk_recursive-w-function-takes-2-parameters-mysqli_real_escape_string.html、最後にはEscaping quotation marks in PHPです。私は現在、PDO版でスクリプトを再作成しようとしていますので、テキストをサニタイズする必要はありません。少なくとも、それは私がやったすべての研究からのより良いアプローチだと私が理解していることです。私が現在探しているのは、文字をエスケープする方法ですが、より雄弁な解決策を見つけることができます。私は成功せずにaddslashesを文字列に配列出力をオンにしてから使用して試してみましたが、テキストをサニタイズする私の試みにおいてPHPで動的に作成された配列でアポストロフィをエスケープする

<?php 


include('connect_local.php'); //Includes DB Connection Script 
ini_set('max_execution_time', 3000); //3000 seconds = 50 minutes 

$emp_get = "SELECT * FROM table1 WHERE person_type LIKE 'Employee'"; 
$emp_data = pg_query($conn, $emp_get); 
while ($emp_row=pg_fetch_array($emp_data)) { 


$oraint_get = "SELECT * FROM table2 WHERE source_enrollment_status_name LIKE 'Attended' AND employee_number LIKE '$emp_row[0]' "; 
$oraint_data = pg_query($conn, $oraint_get); 
$oraint_lms = "Oracle Learning Management Platform"; 
$oranull = ""; 


//foreach ($oraint_row as $oraint) 
while ($oraint_row = pg_fetch_array($oraint_data)){ 




    $data_deposit = "INSERT INTO EDU_DATA (person_number, person_name, preferred_name, person_type, start_date, original_date_of_hire 
           ,hire_date, email_address, region, location, gender, job_name, cbs_level, supervisor_employee_number 
           ,supervisor_name, supervisor_person_type, business_unit, organization_2, organization_3, effective_date 
           ,completion_date, training_item_code, days_on_to_do_list, days_overdue, initial_due_in, initial_due_in_unit 
           ,retraining_due_in, retraining_due_in_unit, retraining_period, retraining_period_unit 
           ,curriculum_code, curriculum_title, learning_course_name, learning_activity, class_duration, college, delivery_method_name 
           ,class_location_name, class_location_country_name, learning_category, source_enrollment_status_name, lms_platform 
           ,supervisor_1 ,supervisor_2, supervisor_3, supervisor_4, supervisor_5, supervisor_6, supervisor_7, supervisor_8) 
          VALUES ('$emp_row[0]','$emp_row[1]','$emp_row[2]','$emp_row[4]','$emp_row[5]','$emp_row[6]','$emp_row[8]' 
            ,'$emp_row[9]','$emp_row[16]','$emp_row[17]','$emp_row[19]','$emp_row[21]','$emp_row[22]','$emp_row[28]' 
            ,'$emp_row[29]','$emp_row[30]','$emp_row[33]','$emp_row[44]','$emp_row[45]','$oraint_row[2]','$oraint_row[3]' 
            ,'$oranull','$oranull','$oranull','$oranull','$oranull','$oranull','$oranull','$oranull','$oranull','$oranull' 
            ,'$oranull','$oraint_row[4]','$oraint_row[5]','$oraint_row[6]','$oraint_row[7]','$oraint_row[8]','$oraint_row[9]' 
            ,'$oraint_row[10]','$oraint_row[11]','$oraint_row[12]','$oraint_lms','$emp_row[46]','$emp_row[47]','$emp_row[48]' 
            ,'$emp_row[49]','$emp_row[50]','$emp_row[51]','$emp_row[52]','$emp_row[53]')"; 
    pg_query($conn, $data_deposit); 

:ここでの主な私は、インポートプロセスのために使用しているコードの一部です

$clnname = $emp_row[1]; 
addslashes($clnname); 

また、ここで見つけた例を使用して再帰的にこれを処理する関数を作成しようとしました:Escape single quotes in every string in phpコードスニペットは以下の通りです:

function escapeApos(array $emp_row) 
{ 

    $return_array = []; 
    array_walk_recursive($emp_row, function($x) use (&$return_array) 
    { 

     $return_array[] = str_replace("'","\\'",$x); 

    } 

    return $return_array; 
} 

私はまた、任意の成功せず、いくつかの他の方法を試してみました。どんな援助や支援も大歓迎です。また、上記の関数を使って、配列内の実際のカラムを宣言して、消したいと思っているかどうかはわかりませんでした。もう一度援助を歓迎します!前もって感謝します!

+0

あなたは 'mysqli_real_escape_string()'を試しましたか? – Optimae

+0

そのテーブルは約5つのテーブルのように見えます。 –

+0

PDOについてはわかりませんが、そのデータベースを正規化して挿入クエリをバインド/サニタイズする必要があります。自動的に実行されます。 – matiaslauriti

答えて

0

申し訳ありませんが、大変感謝してくれています。最初のアプローチではなく、PDOを使用してスクリプトを再作成し始めました。ここにスクリプトのサンプルがあります。しかし、今ではPDOを使用しているので、テキストのサニタイズに関する問題は問題ではありません。私は今からこの方法を使うつもりです!

<?php 

include('connect_local_pdo.php'); //Includes DB Connection Script 
ini_set('max_execution_time', 3000); //3000 seconds = 50 minutes 

try { 
    $stmt = $conn->query('SELECT * FROM table1'); 
    $rows = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

    while ($rows = $stmt->fetch()) { 

     $emp_id = $rows['person_number']; 

     $stmt2 = $conn->query("SELECT * FROM table2 WHERE employee_number LIKE '$emp_id'"); 
     $oracleint = $stmt2->setFetchMode(PDO::FETCH_ASSOC); 

     while ($oracleint = $stmt2->fetch()) { 



      $GO = $conn->prepare("INSERT INTO table3 (person_number, person_name, learning_course_name) VALUES (:emp_number, :emp_name, :learning_course_name)"); 

      $GO->bindParam(':emp_number', $rows['person_number']); 
      $GO->bindParam(':emp_name', $rows['person_name']); 
      $GO->bindParam(':learning_course_name', $oracleint['learning_course_name']); 

      $GO->execute(); 

     } 


     } 

    } catch (PDOException $b) { 
     echo 'Data Extraction Failed: ' . $b->getMessage(); 

    } 

もう一度、初心者を助けてくれてありがとう!私は完全にStackExchangeが大好き!あなたたち最高!

関連する問題