2016-03-05 76 views
0

所以這個問題是,我想創建每當用戶按下登錄在數據庫中的值更改爲1,但每當我使用更新,我們得到一個servererror 500在登錄點擊ServerError 500更新MySQL表

<?php 
require("inc/db.php"); 
ini_set('error_reporting', 0); 
ini_set('display_errors', 0); 

session_start(); 

if(isset($_POST['submit'])){ 
    $errMsg = ''; 
    //username and password sent from Form 
    $username = trim($_POST['username']); 
    $password = trim($_POST['password']); 

    if($username == '') 
    $errMsg .= 'You must enter your Username<br>'; 

    if($password == '') 
    $errMsg .= 'You must enter your Password<br>'; 


    if($errMsg == ''){ 
    $records = $conn->prepare('SELECT id,username,password,email,bday,points,uid FROM users WHERE username = :username AND password = :password'); 
    $records->bindParam(':username', $username) ; 
    $records->bindParam(':password', $password) ; 
    $records->execute(); 
    $results = $records->fetch(PDO::FETCH_ASSOC); 

    if($results > 0){ 

     $sql = "UPDATE users SET isloggedin = :isloggedin WHERE username = :username"; 
     $stmt = $conn->prepare($sql); 
     $stmt->bindParam(':isloggedin', '1'); 
     $stmt->execute(); 


     $_SESSION['username'] = $results['username']; 
     $_SESSION['id'] = $results['id']; 
     $_SESSION['points'] = $results['points']; 
     $_SESSION['uid'] = $results['uid']; 





     header('location:dashboard.php'); 
    }else{ 
     $errMsg .= 'Username and Password are not found<br>'; 
    } 
    } 
} 
?> 

所以,UPDATE功能不能正常工作,我和我的朋友無法找到解決這個問題,我們試圖解決它,或者試圖改變行吧,但是毫無效果......

提前致謝!

+0

我不使用PDO,但我的猜測是你需要在每個查詢中綁定:username參數。服務器500錯誤讓我擔心CGI也許會運行這個錯誤? – Josiah

+0

你是怎麼調用這個例程的?阿賈克斯?錯誤500通常意味着存在PHP語法錯誤或者它期望的發佈數據沒有正確傳遞。 –

+0

我注意到你沒有'bindParam(':username',$ username)',所以我懷疑PDO拋出了一個異常,因爲SQL語句中的參數個數和'execute'中實際可用的參數不一致)'。 –

回答

1

有幾個問題,一旦出現錯誤報告,就會出現一個問題。始終在開發和測試代碼時,始終將error_reporting設置爲E_ALL,並通過ini_set('display_errors', 1)啓用顯示錯誤。這些將一起在屏幕上爲您詳細介紹500錯誤,讓它立即變得更加明顯。

我發現的第一個問題是您的UPDATE聲明有兩個參數:isloggedin, :username但只有第一個與bindParam()綁定。您還必須綁定第二個,因爲PDO正在拋出與無效參數編號有關的異常。

$sql = "UPDATE users SET isloggedin = :isloggedin WHERE username = :username"; 
    $stmt = $conn->prepare($sql); 
    $stmt->bindParam(':isloggedin', '1'); 
    $stmt->bindParam(':username', $username); 
    $stmt->execute(); 

但是,這隻會讓你在那裏。由於使用中的靜態字符串值bindParam(),PDO將接下來的錯誤,因爲它只接受變量作爲其第二個參數(因爲它通過引用來利用它們)。另一種方法是使用bindValue()傳遞一個靜態值。由於您不是通過更改變量值多次執行相同的語句,因此將:usernamebindValue()綁定也是安全的,儘管這樣可以適用於您的情況。

$sql = "UPDATE users SET isloggedin = :isloggedin WHERE username = :username"; 
    $stmt = $conn->prepare($sql); 
    // Make sure static values are bound by value 
    $stmt->bindValue(':isloggedin', '1'); 
    $stmt->bindValue(':username', $username); 
    $stmt->execute();