2017-02-21 33 views
0

我有下面的PHP腳本,應該在點擊註冊按鈕並且地址複選框被選中時執行。PHP執行不會返回任何錯誤,但數據庫中沒有添加任何行

if(isset($_POST['register'])){ 
    if($_POST['addressCheckBox'] == 'Yes'){ 
     if(isset($_POST['streetNumber']) && isset($_POST['route']) && isset($_POST['sublocality_level_1'])){ 
     $unitDetails = trim($_POST['unitDetails']); 
     $streetNumber = mysqli_real_escape_string($db, trim($_POST['streetNumber'])); 
     $route = mysqli_real_escape_string($db, trim($_POST['route'])); 
     $suburb = mysqli_real_escape_string($db, trim($_POST['sublocality_level_1'])); 
     $city = mysqli_real_escape_string($db, trim($_POST['city'])); 
     $zipCode = mysqli_real_escape_string($db, trim($_POST['zipCode'])); 
     $province = mysqli_real_escape_string($db, trim($_POST['province'])); 
     $country = mysqli_real_escape_string($db, trim($_POST['country'])); 
     $email = mysqli_real_escape_string($db, trim($_POST['email'])); 

     if(!empty($streetNumber) && !empty($route) && !empty($city) && !empty($province) && !empty($zipCode) && !empty($country)){ 
      $queryInsertMemberAddress = $db->prepare("INSERT INTO address (memberEmail, unitDetails, houseNumber, streetName, suburb, city, postalCode, province, country) VALUES (?,?,?,?,?,?,?,?,?)"); 

      $queryInsertMemberAddress->bind_param('ssisssiss', $email, $unitDetails, $streetNumber, $route, $suburb, $city, $zipCode, $province, $country); 

      $queryInsertMemberAddress->execute() or die($queryInsertMemberAddress->error); 
     } 
     } 
    } 
} 

腳本運行時我沒有得到任何錯誤,但沒有行插入到數據庫中。我試圖找到這樣做的錯誤如下:

  1. 後的$ queryInsertMemberAddress執行的var_dump - >執行()並返回

    object(mysqli_stmt)[19] 
        public 'affected_rows' => null 
        public 'insert_id' => null 
        public 'num_rows' => null 
        public 'param_count' => null 
        public 'field_count' => null 
        public 'errno' => null 
        public 'error' => null 
        public 'error_list' => null 
        public 'sqlstate' => null 
        public 'id' => null 
    
  2. 執行的print_r對$ queryInsertMemberAddress變量- >執行()並返回

    mysqli_stmt Object ([affected_rows] => 1 [insert_id] => 28 [num_rows] => 0 [param_count] => 9 [field_count] => 0 [errno] => 0 [error] => [error_list] => Array () [sqlstate] => 00000 [id] => 4 
    

我不明白爲什麼的print_r顯示一行受到影響,但沒有記錄顯示在數據庫中。有沒有人看到我出錯的地方?

+1

PHP是否輸入條件? –

+0

@ÁlvaroGonzález是的。我已經通過使用回聲測試它,以確保它實際上進入所有四個條件語句 – Hozington

+0

@Hozington和db連接? –

回答

0

廣泛參與討論

每次調用數據庫類的方法時,你應該把它包在if語句來檢查它是否正確執行,並隨後發現反饋的任何錯誤。

  • MySQL error reporting setup

    if(!$queryInsertMemberAddress = $db->prepare("INSERT INTO address (memberEmail, ... , country) VALUES (?,...,?)")){ 
        die("failed prepare: ".$db->error); 
    } 
    if(!$queryInsertMemberAddress->bind_param('ssisssiss', $email, ..., $country)){ 
        die("failed binding: ".$queryInsertMemberAddress->error); 
    } 
    if(!$queryInsertMemberAddress->execute()){ 
         die("failed execution: ".$queryInsertMemberAddress->error); 
    } 
    
  • 刪除所有mysqli_real_escape_string電話,他們是多餘的。

  • 您的MySQL用戶是否允許將數據插入該表中?您的用戶在您的PHP連接中指定的用戶是否有權訪問INSERT


我可能是完全錯誤的在這裏,但我認爲什麼可以去上你的bind_param語句是破壞你的SQL。

綁定帕拉姆需要給予要素是第一個字符串中指定的類型,你必須ssisssiss這是所有有幾個整數混合。這很好,但你的數據是所有派生來自$_POST元素它們總是字符串

所以如果你var_dump你插入的數據然後你會var_dump很多(string)類型的值。並且沒有(int)類型的值。

$_POST['value'] = "1"; //this is a string 
$value = mysqli_real_escape_string($db,trim($_POST['value'])); //optional, from your code... 
var_dump($value); /// (string)"1"; 

但你不能把綁定帕拉姆到的所有字符串(sssssssss),因爲這會再與數據類型,你想插入MySQL的列不匹配。

我相信發生的事情是,由於這些類型不匹配,bind_param缺少值和/或中止整個SQL,並且出於某種原因不會給您提供適當的錯誤反饋。

如何檢查

if(!$queryInsertMemberAddress->bind_param('ssisssiss', $email, $unitDetails, ...)){ 
    die("bind failed"); //bind_param returns true or false 
} 

解決方案建議:

$streetNumber = (int)$streetNumber; 
$zipCode = (int)$zipCode; 

請讓我知道如何去這個什麼這個結果呈現給你。

相關問題