2013-09-23 39 views
0

我管理某人的網站,雖然當我嘗試修改用戶帳戶的訪問級別製作一個簡單的CMS,它提供了MySQL的語法時才錯誤: -我在哪裏犯了我的錯誤?在我的CMS得到了MySQL的語法錯誤

「你在您的SQL語法中有錯誤;檢查與您的MySQL服務器版本對應的手冊,以在第5行'WHERE user_id = 2'處使用正確的語法。

程序有3個級別的用戶,1 =用戶,2 =主持人,3 =管理員。

這裏是我的代碼:

<?php 
require_once 'db.inc.php'; 
require_once 'cms_http_functions.inc.php'; 

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or 
    die ('Unable to connect. Check your connection parameters.'); 

mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db)); 

if (isset($_REQUEST['action'])) { 

    switch ($_REQUEST['action']) { 
    case 'Login': 
     $email = (isset($_POST['email'])) ? $_POST['email'] : ''; 
     $password = (isset($_POST['password'])) ? $_POST['password'] : ''; 
     $sql = 'SELECT 
       user_id, access_level, name 
      FROM 
       cms_users 
      WHERE 
       email = "' . mysql_real_escape_string($email, $db) . '" AND 
       password = PASSWORD("' . mysql_real_escape_string($password, 
        $db) . '")'; 
     $result = mysql_query($sql, $db) or die(mysql_error($db)); 
      if (mysql_num_rows($result) > 0) { 
      $row = mysql_fetch_array($result); 
      extract($row); 
      session_start(); 
      $_SESSION['user_id'] = $user_id; 
      $_SESSION['access_level'] = $access_level; 
      $_SESSION['name'] = $name; 
     } 
     mysql_free_result($result); 
     redirect('cms_index.php'); 
     break; 

    case 'Logout': 
     session_start(); 
     session_unset(); 
     session_destroy(); 
     redirect('cms_index.php'); 
     break; 

    case 'Create Account': 
     $name = (isset($_POST['name'])) ? $_POST['name'] : ''; 
     $email = (isset($_POST['email'])) ? $_POST['email'] : ''; 
     $password_1 = (isset($_POST['password_1'])) ? $_POST['password_1'] : ''; 
     $password_2 = (isset($_POST['password_2'])) ? $_POST['password_2'] : ''; 
     $password = ($password_1 == $password_2) ? $password_1 : ''; 
     if (!empty($name) && !empty($email) && !empty($password)) { 
      $sql = 'INSERT INTO cms_users 
        (email, password, name) 
       VALUES 
       ("' . mysql_real_escape_string($email, $db) . '", 
       PASSWORD("' . mysql_real_escape_string($password, $db) . '"), 
       "' . mysql_real_escape_string($name, $db) . '")'; 
      mysql_query($sql, $db) or die(mysql_error($db)); 

      session_start(); 
      $_SESSION['user_id'] = mysql_insert_id($db); 
      $_SESSION['access_level'] = 1; 
      $_SESSION['name'] = $name; 
     } 
     redirect('cms_index.php'); 
     break; 
    enter code here 
    case 'Modify Account': 
     $user_id = (isset($_POST['user_id'])) ? $_POST['user_id'] : ''; 
     $email = (isset($_POST['email'])) ? $_POST['email'] : ''; 
     $name = (isset($_POST['name'])) ? $_POST['name'] : ''; 
     $access_level = (isset($_POST['access_level'])) ? $_POST['access_level'] 
      : ''; 
     if (!empty($user_id) && !empty($name) && !empty($email) && 
      !empty($access_level) && !empty($user_id)) { 
      $sql = 'UPDATE cms_users SET 
        email = "' . mysql_real_escape_string($email, $db) . '", 
        name = "' . mysql_real_escape_string($name, $db) . '", 
        access_level = "' . mysql_real_escape_string($access_level, 
         $db) . '", 
       WHERE 
        user_id = ' . $user_id; 
      mysql_query($sql, $db) or die(mysql_error($db)); 
     } 
     redirect('cms_admin.php'); 
     break; 

    case 'Send my reminder!': 
     $email = (isset($_POST['email'])) ? $_POST['email'] : ''; 
     if (!empty($email)) { 
      $sql = 'SELECT email FROM cms_users WHERE email="' . 
       mysql_real_escape_string($email, $db) . '"'; 
      $result = mysql_query($sql, $db) or die(mysql_error($db)); 
      if (mysql_num_rows($result) > 0) { 
       $password = strtoupper(substr(sha1(time()), rand(0, 32), 8)); 
       $subject = 'Comic site password reset'; 
       $body = 'Looks like you forgot your password, eh? No worries. ' . 
        'We\'ve reset it for you!' . "\n\n"; 
       $body .= 'Your new password is: ' . $password; 
       mail($email, $subject, $body); 
      } 
      mysql_free_result($result); 
     } 
     redirect('cms_login.php'); 
     break; 

    case 'Change my info': 
     session_start(); 
     $email = (isset($_POST['email'])) ? $_POST['email'] : ''; 
     $name = (isset($_POST['name'])) ? $_POST['name'] : ''; 
     if (!empty($name) && !empty($email) && !empty($_SESSION['user_id'])) 
     { 
      $sql = 'UPDATE cms_users SET 
        email = "' . mysql_real_escape_string($email, $db) . '", 
        name = "' . mysql_real_escape_string($name, $db) . '", 
       WHERE 
        user_id = ' . $_SESSION['user_id']; 
      mysql_query($sql, $db) or die(mysql_error($db)); 
     } 
     redirect('cms_cpanel.php'); 
     break; 
    default: 
     redirect('cms_index.php'); 
    } 
} else { 
    redirect('cms_index.php'); 
} 
?> 

我似乎無法找到代碼中的任何錯誤。請幫忙。

+0

打印出'$ sql';不要使用'mysql_'函數,請閱讀[SQL注入](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)。 – 2013-09-23 02:54:44

+1

這個問題似乎是脫離主題,因爲它是關於找到一個逗號 – geoffspear

+0

@Wooble,我敢肯定,這不會使它脫離主題,否則在_any_代碼中會有大量的運行時錯誤將被禁止在SO上,比如爲什麼'for(i = 0; i <10; j ++)'永遠不會結束。 – paxdiablo

回答

1

在「修改帳戶」的情況下,你必須在一行中的額外的逗號:

   access_level = "' . mysql_real_escape_string($access_level, 
        $db) . '", 
          ^here 

但我求求你了,在新代碼中不使用mysql_功能。他們凌亂,已過時,並正式棄用。學習PHP的PDO用於數據庫訪問。一旦你習慣了它,你會發現它更簡單,更整潔,更安全。

1

的片段:

'access_level = "' . mysql_real_escape_string($access_level, $db) . '", WHERE...' 

(這是比較容易看到在同一行)具有where子句前一個逗號。

擺脫它。可以在設置另一列時使用逗號,但不要在where之前。請記住,在90%的情況下,如果您在執行它們之前(在調試過程中,而不是在生產過程中)簡單地輸出SQL字符串,則這些問題很容易檢測到。

此外,您需要了解如何使用參數化查詢,以提高可讀性並防止潛在安全漏洞(SQL注入)。