2014-09-28 143 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:我認爲,這是:disease_1
  • 沒有名爲addmod_tsrecruit_ts佔位

我不能讓任何錯誤信息

是你的至少執行if

比 「未定義指數」

這是一些警告其他?

要使用try/catch,你有$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);在第一位嗎?

+0

非常感謝您的調試!要按順序回答你的觀點: - yup:$ disease_1絕對是一個錯字,糾正了(有點不成功......嘆了口氣)。 - 是的,我知道addmod_ts和recuit_ts(兩個timespamps)都是MySQL函數(NOW()),但是我怎樣才能使用指定的佔位符來綁定這些值?是的,所有If語句都完成並沒有問題。是的,我在正確的建議中在連接文件中有正確的ERRMODE屬性。未定義的年齡,DOB,死亡,FUP_Months和FUP_Years(大部分是計算值)的Idexes ...感謝,讚賞! – Diego 2014-09-28 17:50:40

+0

您不必綁定'addmod_ts'和'recuit_ts'(即刪除bindParam行),因爲這些佔位符不會出現在查詢中。對於「未定義索引」錯誤,請檢查您的表單(如果您需要我們查看,請修改您的問題);) – julp 2014-09-28 17:53:21

+0

YES!它的工作原理:-)只是刪除錯誤bindParam固定查詢,現在數據正確地添加到數據庫:-)非常感謝你,非常寶貴的幫助和支持,真的很感激!不過我有點擔心我的錯誤處理程序策略無法幫助我理解這一點...無論如何一個錯誤,我不會在未來重複(希望):) – Diego 2014-09-28 18:03:20