2014-09-26 76 views
0

我在SQL語句中的變量有問題。我有一個表單,用戶可以更新他的個人資料。表單重定向到action.php?action=settings從PHP變量更新DB數據

當我嘗試沒有$變量時,沒有問題!但問題是,我有很多像這樣的查詢,但不是用於更新。

function change_user_data($trainer) { 
    require("database.php"); 

    try { 
     $results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");   
    } catch (Exception $e) { 
     echo "Data could not be changed!"; 
     exit; 
    } 
} 

,這是我action.php

if ($action == "settings") { 
    $email = $_POST['email']; 
    $status = $_POST['status']; 
    $password = $_POST['password']; 

    change_user_data($trainer); 
} 

當我echo那些$variables,他們得到展示,使他們不爲空。但是這個查詢更新我的表,但沒有數據,所以之後一切都是空的。

+0

我不是PHP的專家,但是從[這個問題](http://stackoverflow.com/questions/5838709/using-variables- in-mysql-update-php-mysql?rq = 1),我認爲在連接查詢中的數據時存在問題。但是,這似乎很容易SQL注入,並會更好地使用[準備語句](http://www.phpeveryday.com/articles/PDO-Insert-and-Update-Statement-Use-Prepared-Statement-P552.html ) – 2014-09-26 07:50:48

回答

0

我認爲問題是變量範圍。

函數外部定義的變量不能在函數中使用,除了全局變量或其他東西。

你有兩種方法。

首先。如果change_user_data功能是action.php的文件,加上 「全球$電子郵件,$地位,$密碼」 是這樣的:

function change_user_data($trainer) { 

    global $email, $status, $password; 

    require("database.php"); 

    try { 
     $results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");   
    } catch (Exception $e) { 
     echo "Data could not be changed!"; 
     exit; 
    } 
} 

或第二。傳遞電子郵件,狀態,密碼數據。然後你可以使用它。

請查看本手冊:

http://php.net/manual/en/language.variables.scope.php

+0

雖然您的診斷是正確的,但處方可能不會。請不要建議使用全局變量來實現這麼簡單的功能,它可以通過向函數 – 2014-09-26 07:51:53

+0

添加參數來完成,所以這對我很有用,但是我像Touregsys那樣寫了:change_user_data($ trainer,$ email,$ password, $狀態);我認爲這是這樣的事情的最佳方式,或者你認爲是什麼?你能告訴我爲什麼我應該使用全球 – 2014-09-26 11:10:12

0

你可以試試這個:

$results = $db->query("UPDATE trainer SET email='".$email."', status='".$status."', password='".$password."' WHERE name='".$trainer."'");   
0
change_user_data($trainer, $email, $password, $status); 

function change_user_data($trainer, $email, $password, $status) { 
    require("database.php"); 

    try { 
     $results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");   
    } catch (Exception $e) { 
     echo "Data could not be changed!"; 
     exit; 
    } 
} 
0

後您Gettings後可變因素然後檢查這些變量 是否那些空或不 如果不爲空或NULL則使用非空變量更新查詢更新數據庫

0

可能是你列的

  • 錯誤的數據類型。仔細檢查你的餐桌結構。例如:如果您將列電子郵件設置爲int,則無法以文本或字母插入或更新其行值
  • 單引號內的不正確變量。嘗試來連接變量和查詢字符串,更好的做法

如果這些不工作

儘量讓MySQL的語法錯誤,並檢查這些變量的值,那麼你可以定義錯誤。

對不起我的英文不好

0

你有這個功能的幾個問題:

  • 範圍界定問題,你沒有通過所有值
  • 您是容易受到SQL注入
  • 你不檢查記錄是否更新

功能:

function change_user_data($db, $params) { 
    try { 
     $sql = "UPDATE trainer SET email= ?, status=?, password=? WHERE name=?"; 
     $stmt = $db->prepare($sql); 
     $stmt->execute($params); 
     $success = ($stmt->rowCount() > 0) ? true : false; 
    } catch (Exception $e) { 
     echo "Data could not be changed!"; 
     $success = false; 
    } 
return $success; 
} 

使用

require("database.php"); 

$params = array($trainer, $email, $password, $status); 
$user_data_updated = change_user_data($db, $params); 

if($user_data_updated){ 
    echo 'user data updated'; 
}else{ 
    echo 'user data did not update'; 
}