2016-06-16 2 views
0

"call_list"と呼ばれる現在のデータベースがあります。その中に、colums id、name、email、およびtelを持つcall_listというテーブルがあります。PHPはmysqlデータベースの電子メール、電話、および名前を確認します

何らかの理由で私のコードが正しく機能していないため、データベース内の何かと一致しても同じ情報が挿入され続けます。

<?php 
//server info 
$servername = "***.***.**.***"; 
$username = "********"; 
$password = "*****************"; 
$dbname = "call_list"; 
//create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 
//test connection 
if(!$conn){ 
    die("Connection Failed: ". $mysqli_connect_error()); 
} 
//check for name in the database 
$sql_check = "SELECT * FROM call_list WHERE name = '".$name."'"; 
$sure_check = mysqli_query($conn, $sql_check); 
$checked = mysqli_affected_rows($sure_check); 
if($checked == 0){ 
    //check for email in database 
    $sql_check2 = "SELECT * FROM call_list WHERE email = '".$email."'"; 
    $sure_check2 = mysqli_query($conn, $sql_check2); 
    $checked2 = mysqli_affected_rows($sure_check2); 
    if($checked == 0){ 
     //check for telephone in the database 
     $sql_check3 = "SELECT * FROM call_list WHERE tel ='".$tel2."'"; 
     $sure_check3 = mysqli_query($sql_check3); 
     $checked3 = mysqli_affected_rows($sure_check3); 
     if($checked3 == 0){ 
      //try to insert info 
      $sql2 = "INSERT INTO call_list (name, email, tel) VALUES ('$name', '$email', '$tel2')"; 
      if(mysqli_query($conn, $sql2)){ 
      //set session variable to success 
      $_SESSION['result_sql'] = "<div class='alert alert-success'>New record created successfully</div>"; 
      }else{ 
       //set session variable to failure 
       $_SESSION['result_sql'] = "<div class='alert alert-danger'>Error: ". $sql . "<br>". mysqli_error($conn)."</div>"; 
      } 
     }else{ 
     //set session variable to duplicate telly 
     $_SESSION['result_sql'] = "<div class='alert alert-warning'>Client phone number already in database</div>"; 
     } 
    }else{ 
    //set session variable to duplicate email 
    $_SESSION['result_sql'] = "<div class='alert alert-warning'>Client email already in database</div>"; 
    } 
}else{ 
//set session variable to duplicate name 
$_SESSION['result_sql'] = "<div class='alert alert-warning'>Client name already in database</div>"; 
} 
//finally close the connection. 
mysqli_close($conn); 
?> 
+0

は、これは動作するコードであるべきところ$ nameは、$メール、...から来るのでしょうか?第2回:準備されたステートメント、SQLインジェクションに脆弱なステートメントについて学びます。 – Jeff

+0

そして、あなたが 'select * from call_list where x = y OR z = a ... 'を使うならば、すべてのifを1つに減らすことができます。 – Jeff

+0

3番目のmysqli_affected_rowsはmysqli_resultオブジェクトではなくmysqliリンクオブジェクトを取りますパラメータ:http://php.net/manual/en/mysqli.affected-rows.php – Jeff

答えて

2

をdb.php

私はDEBUGに読んで、そのために簡単に、それは簡単にするためにコードをリファクタリング。 私はあなたの主なmisstakeがmysqli_affected_rows($link)linkオブジェクトではなく、結果を渡したと思います。

$sure_check3 = mysqli_query($sql_check3); 
$checked3 = mysqli_affected_rows($sure_check3); 

documentation hereを参照してください。 (私はprepared statementsに変更したことに、注意!)
第一

<?php 
// assuming we have a valid mysqli-connection as $conn 
// assuming we have escaped user-input in $name, $email, $tel 

// 1. check if we have an entry in database that matches any user-input 
$sql_check = "SELECT * FROM call_list WHERE name = ? OR email=? OR tel=? "; 

$stmt = mysqli_prepare($conn, $sql_check); 
if(!$stmt) { 
    echo "DB-Error: prepare failed"; 
    exit; 
} 

$bindSuccess = mysqli_stmt_bind_param($stmt, "sss", $name, $email, $tel); 
if(!$stmt) { 
    echo "DB-Error: bind param failed"; 
    exit; 
} 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $savedName, $savedEmail, $savedTel); 
$flagOneFound=false; 
// check what had matched to set flags, that we then can return fitting messages later 
while(mysqli_stmt_fetch($stmt)) { 
    $flagOneFound=true; 
    if($savedEmail===$email) { 
     $flagEmail=true; // you also could echo out here and exit script - maybe better 
    } 
    if($savedName===$name) { 
     $flagName=true;  // and/or here 
    } 
    if($savedTel===$tel) { 
     $flagTel=true;  // and/or here 
    } 
} 

if(!$flagOneFound){ 
    // insert info 
    $sql_insert = "INSERT INTO call_list (name, email, tel) VALUES (?, ?, ?)"; 
    $stmt = mysqli_prepare($conn, $sql_insert); 
    // I left out all the checks here for simplicity 
    mysqli_stmt_bind_param($stmt, "sss", $name, $email, $tel); 
    mysqli_stmt_execute($stmt); 
    if(mysqli_affected_rows($conn)===1) { // note, that I pass $conn here! not $stmt 
     echo "Insert successfull"; 
    }else{ 
     echo "could not insert new user", 
    } 
} else { 
    if($flagEmail) { echo "There's already a record with that Email" }; 
    if($flagName) { echo "There's already a record with that Name" }; 
    if($flagTel) { echo "There's already a record with that Tel" }; 
} 

?> 
関連する問題