2014-09-28 4 views
0

PDO 준비를 위해 코드를 리팩토링하려고하는데, 무엇인가 잘못되어 이해할 수 없습니다. PDO 준비된 INSERT 쿼리를 사용하는 다음 코드가 분명히 실행됩니다. "정의되지 않은 인덱스"에 대한 경고 이외의 오류 메시지가 표시되지만 인구 통계 테이블에 데이터가 삽입되지 않습니다. 또한 MySQL을 검사하고 모든 것을 작성하거나 삭제할 수있는 올바른 권한이 있습니다. 모든 도움을 주시면 감사하겠습니다. print_r ($ _ POST)가 정상적으로 작동하지만 stmt-> execute(); 명령에서 아무런 값을 얻을 수 없습니다. print_r ($ value = stmt-> execute()); . 코드는 다음과 같습니다.PDO INSERT 준비된 문, 오류가 없지만 데이터가 삽입되지 않았습니다.

// First --> Let us then include info regarding the connection to the database, PHP functions, and header section and page title 

require('../../includes/config.inc.php'); 
require('../../includes/db_connection.php'); 
require('../../includes/functions.php'); 
require('../elements/layouts/header.php'); 

// Second --> Let's 'Check whether user has the rights to see current page or not 

if(!isLoggedIn()) //"isLoggedIn" is a pre-specified function in functions.php file 
    { 
    header('Location: ../index.php'); 
    die(); 
    } 

/* 
Setup some variables/arrays: First we are creating a blank array called action and then setting an array value of result. 
Result is going to hold a value of either success or error. Next we create another blank array called text. 
This is going to hold any text we want to show the user during the signup. 
*/ 
$action = array(); 
$action['result'] = null; 
$text = array(); 

// Check if the form has been submitted: 
if (isset($_POST['enroll'])) { 


// On the other hand, if there are no errors, we can go ahead and enroll the patient: 

    if($action['result'] != 'error'){ 



     // let's start a try/catch loop and submit the query via mysqli prepared statement 

     try { 

      //let's define the variables involved, starting with the fields coming from the Demographics form 

      $pid  = null; // this can be anything (MySQL will overwrite this value in any case) 
      $addmod_ts = date('Y-m-d H:i:s'); 
      $address = $_POST['address']; 
      $age = $_POST['age']; 
      $censor_d = $_POST['censor_d']; 
      $city = $_POST['city']; 
      $clinic = $_POST['clinic']; 
      $death = $_POST['death']; 
      $dis_cat_main = $_POST['dis_cat_main']; 
      $dis_cat_spec = $_POST['dis_cat_spec']; 
      $disease_1 = $_POST['disease_1']; 
      $disease_2 = $_POST['disease_2']; 
      $disease_3 = $_POST['disease_3']; 
      $disease_4 = $_POST['disease_4']; 
      $dob = $_POST['dob']; 
      $email_1 = $_POST['email_1']; 
      $email_2 = $_POST['email_2']; 
      $firstname = $_POST['firstname']; 
      $fup_months = $_POST['fup_months']; 
      $fup_years = $_POST['fup_years']; 
      $institution = $_POST['institution']; 
      $lastname = $_POST['lastname']; 
      $locked = $_POST['locked']; 
      $notes = $_POST['notes']; 
      $phone_1 = $_POST['phone_1']; 
      $phone_2 = $_POST['phone_2']; 
      $phone_3 = $_POST['phone_3']; 
      $physician = $_POST['physician']; 
      $province = $_POST['province']; 
      $pt_department = $_POST['pt_department']; 
      $pt_location = $_POST['pt_location']; 
      $recruit_ts = date('Y-m-d H:i:s'); 
      $region = $_POST['region']; 
      $research = $_POST['research']; 
      $saved = $_POST['saved']; 
      $sex = $_POST['sex']; 
      $specdis_1a = $_POST['specdis_1a']; 
      $specdis_1b = $_POST['specdis_1b']; 
      $ssn = $_POST['ssn']; 
      $study = $_POST['study']; 
      $zip = $_POST['zip']; 
      $month = $_POST['month']; 
      $day = $_POST['day']; 
      $year = $_POST['year']; 

      //Let us start basic validation: make sure everything required has been inserted 

      if (empty($lastname)){ 
       $action['result'] = 'error'; array_push($text,'Please insert patient last name'); 
      } 
      if (empty($firstname)){ 
       $action['result'] = 'error'; array_push($text,'Please insert patient first name '); 
      } 
      if (!is_numeric ($sex)) { 
       $action['result'] = 'error'; array_push($text,'Please insert patient gender'); // SEX is a Number so must be treated accordingly (if empty does not work here) 
      } 
      if (empty($disease_1)){ 
       $action['result'] = 'error'; array_push($text,'Please insert at least the first medical issue'); // Disease_1 is a Number so must be treated accordingly (if empty does not work here) 
      } 
      if (empty($address)){ 
       $action['result'] = 'error'; array_push($text,'Please insert patient Address'); 
      } 
      if (empty($city)){ 
       $action['result'] = 'error'; array_push($text,'Please insert city name'); 
      } 
      if (empty ($phone_1)){ 
       $action['result'] = 'error'; array_push($text,'Please insert at least one valid phone number '); 
      } 
      if (empty($email_1)){ 
       $action['result'] = 'error'; array_push($text,'Please insert at least one valid e-mail address'); 
      } 
      // then let us define and validate DOB and put the date in SQL format 

      // Validate the month. 
      if (is_numeric ($month)) { 
       $dob = $month . '-'; 
      } else { 
       $action['result'] = 'error'; array_push($text,'Please insert a valid Month for patient birth date'); 
      } 
      // Validate the day. 
      if (is_numeric ($day)) { 
       $dob .= $day . '-'; 
      } else { 
       $action['result'] = 'error'; array_push($text,'Please insert a valid Day for patient birth date'); 
      } 
      // Validate the year. 
      if (is_numeric ($year)) { 
       $dob = $year . '-' . $month . '-' . $day; // Set Birthdate in SQL format 
      } else { 
       $action['result'] = 'error'; array_push($text,'Please insert a valid Year for patient birth date'); 
      } 


      // Finally, we can go ahead with the SQL INSERT query 

      $sql = 'INSERT INTO `demographics` ( PID, 
                ADDMOD_TS, 
                ADDRESS, 
                AGE, 
                CENSOR_D, 
                CITY, 
                CLINIC, 
                DEATH, 
                DIS_CAT_MAIN, 
                DIS_CAT_SPEC, 
                DISEASE_1, 
                DISEASE_2, 
                DISEASE_3, 
                DISEASE_4, 
                DOB, 
                EMAIL_1, 
                EMAIL_2, 
                FIRSTNAME, 
                FUP_MONTHS, 
                FUP_YEARS, 
                INSTITUTION, 
                LASTNAME, 
                LOCKED, 
                NOTES, 
                PHONE_1, 
                PHONE_2, 
                PHONE_3, 
                PHYSICIAN, 
                PROVINCE, 
                PT_DEPARTMENT, 
                PT_LOCATION, 
                RECRUIT_TS, 
                REGION, 
                RESEARCH, 
                SAVED, 
                SEX, 
                SPECDIS_1A, 
                SPECDIS_1B, 
                SSN, 
                STUDY, 
                ZIP 
                  ) 
            VALUES (   :pid, 
                 NOW(), 
                 :address, 
                 :age, 
                 :censor_d, 
                 :city, 
                 :clinic, 
                 :death, 
                 :dis_cat_main, 
                 :dis_cat_spec, 
                 :$disease_1, 
                 :disease_2, 
                 :disease_3, 
                 :disease_4, 
                 :dob, 
                 :email_1, 
                 :email_2, 
                 :firstname, 
                 :fup_months, 
                 :fup_years, 
                 :institution, 
                 :lastname, 
                 :locked, 
                 :notes, 
                 :phone_1, 
                 :phone_2, 
                 :phone_3, 
                 :physician, 
                 :province, 
                 :pt_department, 
                 :pt_location, 
                 NOW(), 
                 :region, 
                 :research, 
                 :saved, 
                 :sex, 
                 :specdis_1a, 
                 :specdis_1b, 
                 :ssn, 
                 :study, 
                 :zip 

               )'; 

      $stmt = $db->prepare($sql); 

      $stmt->bindParam(':pid' , $pid, PDO::PARAM_INT); 
      $stmt->bindParam(':addmod_ts' , $addmod_ts, PDO::PARAM_STR); 
      $stmt->bindParam(':address' , $address, PDO::PARAM_STR); 
      $stmt->bindParam(':age' , $age, PDO::PARAM_INT); 
      $stmt->bindParam(':censor_d' , $censor_d, PDO::PARAM_STR); 
      $stmt->bindParam(':city' , $city, PDO::PARAM_STR); 
      $stmt->bindParam(':clinic' , $clinic, PDO::PARAM_STR); 
      $stmt->bindParam(':death' , $death, PDO::PARAM_INT); 
      $stmt->bindParam(':dis_cat_main' , $dis_cat_main, PDO::PARAM_STR); 
      $stmt->bindParam(':dis_cat_spec' , $dis_cat_spec, PDO::PARAM_STR); 
      $stmt->bindParam(':disease_1' , $disease_1, PDO::PARAM_STR); 
      $stmt->bindParam(':disease_2' , $disease_2, PDO::PARAM_STR); 
      $stmt->bindParam(':disease_3' , $disease_3, PDO::PARAM_STR); 
      $stmt->bindParam(':disease_4' , $disease_4, PDO::PARAM_STR); 
      $stmt->bindParam(':dob' , $dob, PDO::PARAM_STR); 
      $stmt->bindParam(':email_1' , $email_1, PDO::PARAM_STR); 
      $stmt->bindParam(':email_2' , $email_2, PDO::PARAM_STR); 
      $stmt->bindParam(':firstname' , $firstname, PDO::PARAM_STR); 
      $stmt->bindParam(':fup_months' , $fup_months, PDO::PARAM_INT); 
      $stmt->bindParam(':fup_years' , $fup_years, PDO::PARAM_INT); 
      $stmt->bindParam(':institution' , $institution, PDO::PARAM_STR); 
      $stmt->bindParam(':lastname' , $lastname, PDO::PARAM_STR); 
      $stmt->bindParam(':locked' , $locked, PDO::PARAM_INT); 
      $stmt->bindParam(':notes' , $notes, PDO::PARAM_STR); 
      $stmt->bindParam(':phone_1' , $phone_1, PDO::PARAM_STR); 
      $stmt->bindParam(':phone_2' , $phone_2, PDO::PARAM_STR); 
      $stmt->bindParam(':phone_3' , $phone_3, PDO::PARAM_STR); 
      $stmt->bindParam(':physician' , $physician, PDO::PARAM_STR); 
      $stmt->bindParam(':province' , $province, PDO::PARAM_STR); 
      $stmt->bindParam(':pt_department' , $pt_department, PDO::PARAM_STR); 
      $stmt->bindParam(':pt_location' , $pt_location, PDO::PARAM_STR); 
      $stmt->bindParam(':recruit_ts' , $recruit_ts, PDO::PARAM_STR); 
      $stmt->bindParam(':region' , $region, PDO::PARAM_STR); 
      $stmt->bindParam(':research' , $research, PDO::PARAM_INT); 
      $stmt->bindParam(':saved' , $saved, PDO::PARAM_INT); 
      $stmt->bindParam(':sex' , $sex, PDO::PARAM_INT); 
      $stmt->bindParam(':specdis_1a' , $specdis_1a, PDO::PARAM_STR); 
      $stmt->bindParam(':specdis_1b' , $specdis_1b, PDO::PARAM_STR); 
      $stmt->bindParam(':ssn' , $ssn, PDO::PARAM_STR); 
      $stmt->bindParam(':study' , $study, PDO::PARAM_STR); 
      $stmt->bindParam(':zip' , $zip, PDO::PARAM_STR); 



      $stmt->execute(); 






      $errorInfo = $stmt->errorInfo(); 
      if (isset($errorInfo[2])) { 
       print_r($error = $errorInfo[2]); 
      } 

     } catch (Exception $e) { 
      $error = $e->getMessage(); 
         } 


     // Tell the user we have done successfully 
     $action['result'] = 'success'; 
     array_push($text,'Patient is on Kardia now'); 


    } 





    //A quick check of our action result value and we can continue on with the signup. If our result is error we will 
    //skip over all the above code and output the errors to our user so they can make the necessary changes. 
    // The last piece of this code we are putting the values of your text array into our action array. 

    $action['text'] = $text; 

} 

?> 

<?= show_errors($action); //This calls the function show_errors, to format validation appropriately ?> 

답변

2

r은 결합 :

  • :$disease_1 : 나는 그것이 내가

    가 된 오류 메시지를받을 수 없습니다

addmod_ts 또는 recruit_ts를라는 이름의 자리가없는 :disease_1

  • 생각하여 if 적어도 실행? "정의되지 않은 인덱스"입니다

  • 에 대한 몇 가지 경고가 아닌 다른

    ?

    try/catch를 사용하려면 먼저 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);이 있습니까?

    +0

    덕분에 디버깅에 많은 도움이되었습니다. 귀하의 요점에 순서대로 답하기 위해서 : - yup : $ disease_1은 확실히 오타입니다. (아직 성공하지 못했습니다 ... 한숨). - 네, addmod_ts와 recuit_ts (두 timespamps)는 MySQL 함수 (NOW())입니다. 그렇다면이 값들을 어떻게 명명 된 자리 표시자를 사용하여 bindParam 할 수 있습니까? 예, 모든 If 문은 아무 문제없이 끝까지 완료됩니다. 예, 맞습니다 제안한대로, connument 파일에 올바른 ERRMODE 특성이 있습니다. 나이, DOB, 사망, FUP_Months 및 FUP_Years에 대한 정의되지 않은 아이디어 (대부분이 계산 된 값 임) ... 감사합니다. – Diego

    +0

    당신은'addmod_ts'와'recuit_ts'를 바인딩 할 필요가 없습니다 (즉, bindParam 라인을 삭제하십시오). 왜냐하면이 자리 표시자가 쿼리에 나타나지 않기 때문입니다. "정의되지 않은 색인"오류의 경우 양식을 확인하십시오 (검토가 필요하면 질문을 수정하십시오);) – julp

    +0

    예! 그것은 작동했습니다 :-) 잘못된 bindParam을 제거하면 쿼리가 고정되어 이제 데이터가 DB에 올바르게 추가됩니다 .--) 정말 고맙고 유익하지 않은 도움과 지원을 해주셔서 감사합니다. 아직도 나는 실수 처리자 정책이 이것을 잡아내는 데 도움이 될 수 없다는 것을 조금은 걱정하고있다 ... 어쨌든 한 가지 실수는 적다. 앞으로는 (잘하면) 반복하지 않을 것이다. :) – Diego

    관련 문제