2017-02-21 7 views
0

私は、登録ボタンがクリックされたとき、およびアドレスチェックボックスがチェックされているときに実行されるべき以下のPHPスクリプトを持っています。PHP executeはエラーを返しませんが、データベースに行が追加されていません

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を実行 - >)(を実行し、それがますprint_rを実行

    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. 返します- > execute()の後に$ queryInsertMemberAddress変数にがあり、

    を返します。 0
    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行が影響を受けたことを示しているが、レコードがデータベースに表示されていない理由を私は理解できません。私はどこに間違っていたのか誰にでも見える?

+1

PHPは条件付きで入力しますか? –

+0

@ÁlvaroGonzálezはいそうです。私はそれが実際にすべての4つの条件文を入力することを確認するためにechoを使ってテストしました – 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を妨害されている上に行くことができます。

バインドparamはそれは大丈夫です。あなたが混入し、数整数を持つすべてのの文字列あるssisssissを持って、最初の文字列で指定されたタイプのものであると指定した要素を必要としますが、あなたのデータすべての派生されます$_POST要素から常にの文字列です。

したがって、挿入するデータをvar_dumpすると、多くの(string)型の値がvar_dumpされます。また、値は(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"; 

しかし、これは、あなたがに挿入しようとしているMySQLの列のデータ型の不一致になるので、あなたはすべての文字列(sssssssss)にバインドのParamをオンにすることはできません。

これらのタイプの不一致により、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; 

を私はこれがどのようになる知っている、これはあなたに提示するもの結果ください。

関連する問題