2011-08-11 71 views
0

我嘗試插入一個人的詳細信息,它已成功插入。如果我檢查DB「相同的數據插入3次」。爲什麼數據插入3次?如何使用oops php概念從數據庫插入數據?

我在數據庫中有這個數據。

id  name  dob    gen 
1  James  12-03-1977  M 
2  James  12-03-1977  M 
3  James  12-03-1977  M 

PHP類

class Detail 
{ 
function savePerson_detail($vars){ 
    foreach($vars as $key => $value){ 
     if(is_numeric($key) && $value >0){ 
     $qry = sprintf("INSERT INTO cca_student_list(per_name, per_dob, per_gen) VALUES('%s', '%s', '%s')", 
     mysql_real_escape_string($vars['name']), 
     mysql_real_escape_string($vars['dob']), 
     mysql_real_escape_string($vars['gen'])); 
     mysql_query($qry) or die(mysql_error()); 
     if($qry) 
    { 
    print 'Successfully Insert your details'; 
    } 
    } 
} 

HTML頁面

<?php 
$detail = new Detail(); 
if(isset($_POST['btnSaveDetail'])){ 
    $detail->savePerson_detail($_POST); 
}?> 
+0

您的問題標題與您的問題內容並不完全相關...... – Raptor

+0

您可以製作$ _POST變量的print_r()嗎? – pleasedontbelong

回答

1

你實際運行查詢三次,這就是爲什麼你插入數據的三倍。只要運行一次查詢,你應該沒問題。

要做到這一點,您需要更改您的代碼:首先完整輸入數據,然後運行查詢。您目前正在挑選$vars(其中有三個元素)的每個元素,然後運行查詢,每個元素的時間爲

做一步後,其他:

function savePerson_detail($vars) 
{ 
    // validate function input 
    foreach($vars as $key => $value) 
    { 
     if(!is_numeric($key) || !$value >0) 
     return; 
    } 

    // build sql query 
    $qry = sprintf(
     "INSERT INTO cca_student_list(per_name, per_dob, per_gen) VALUES('%s', '%s', '%s')", 
     mysql_real_escape_string($vars['name']), 
     mysql_real_escape_string($vars['dob']), 
     mysql_real_escape_string($vars['gen']) 
    ); 

    // run sql query 
    $result = mysql_query($qry) or die(mysql_error()); 

    // check query result 
    if($result) 
    { 
     print 'Successfully Insert your details'; 
    } 
} 
+0

只是一個小小的建議:這個函數可以返回true或false,而不是使用'print'。或者可能拋出一個異常,主要的PHP文件應該捕獲 – pleasedontbelong

+0

是的,它可以使用PDO,依賴注入,真正的驗證,SQL字符串的構建器,使用中的數據配置的參數化等。有很多涉及到但是對我來說,重要的是先從原始代碼開始處理它所存在的邏輯缺陷。 – hakre

0

因爲使用

foreach($vars as $key => $value){ 

時傳遞給它$vars$_POST看起來是這樣的。

$_POST['name'] = 'James'; 
$_POST['dob'] = '12-03-1977'; 
$_POST['gen'] = 'M'; 

所以它通過你的每個$_POST項目3次。 我認爲你可以刪除驗證,並像這樣做。

function savePerson_detail($vars){ 
    $qry = sprintf("INSERT INTO cca_student_list(per_name, per_dob, per_gen) VALUES('%s', '%s', '%s')", mysql_real_escape_string($vars['name']), mysql_real_escape_string($vars['dob']), mysql_real_escape_string($vars['gen'])); 
    mysql_query($qry) or die(mysql_error()); 
    if($qry) 
    { print 'Successfully Insert your details'; } 
} 
0

除非我失去了一些東西,這是你想要做的嗎?

class Detail 
{ 
function savePerson_detail($vars) { 
    foreach($vars as $key => $value) { 
      $vars[$key] = mysql_real_escape_string($value); 
    } 

    if($qry) 
    { 
     print 'Successfully Insert your details'; 
    } 

    $qry = sprintf("INSERT INTO cca_student_list(per_name, per_dob, per_gen) VALUES('%s', '%s', '%s')"; 
    mysql_query($qry) or die(mysql_error()); 
}