2013-04-30 90 views
1

我想執行一個註冊class.But查詢不起作用(查詢突出顯示。它似乎是一個簡單的問題,但我沒有看到它,我呼應查詢和複製並通過phpMyAdmin的SQL查詢框執行它,它說錯誤1064.我似乎無法找到任何問題的。爲什麼我的查詢不適用於mysql?語法似乎是正確

<?php 
class register 
{ 
    protected $username; 
    protected $password; 
    protected $email; 
    protected $postcode; 

    public function __construct() 
    { 
    } 

    public function insertuser($username, $password,$email, $postcode) 
    { 
     $this->_email = mysql_real_escape_string($email); 
     $this->_password = mysql_real_escape_string($password); 
     $this->_username = mysql_real_escape_string($username); 
     $this->_postcode = mysql_real_escape_string($postcode); 



    **$query = "INSERT INTO 'users'('user_id', 'username', 'password', 'email', 'postcode') VALUES (NULL,'{$username}','{$password}','{$email}','{$postcode}');";** 


     echo $query; 
     $result = mysql_query($query); 
     return $result; 
    } 


} 
?> 
+0

您使用的報價不正確。你也不應該使用普通的mysql,而應該研究mysqli或者PDO。 – Tomanow 2013-04-30 21:27:55

+1

我總是看到這種類型的問題,你應該閱讀[PHP和MySQL的常用數據庫調試](http://jason.pureconcepts.net/2013/04/common-debugging-php-mysql/)。 – 2013-04-30 21:27:56

+1

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?瞭解[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http:// php。net/pdo)或[MySQLi](http://php.net/mysqli) - [本文](http://j.mp/QEx8IB)將幫助您決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – ceejayoz 2013-04-30 21:30:17

回答

1

error 1064意味着SQL語法錯誤。你用周圍的表名和列單引號名稱:'通過backtics替換它們:`

"INSERT INTO `users` (
    `user_id`, `username`, `password`, `email`, `postcode` 
) VALUES (
    NULL,'{$username}','{$password}','{$email}','{$postcode}' 
);" 

進一步注意,你不應該使用mysql擴展名編寫新代碼。它已被PHP開發人員棄用。改爲使用PDOmysqli

0

語法看起來是錯誤的。表名和列名不應有引號。他們應該反抗或什麼都不要。否則,它們被視爲字符串文字。

INSERT INTO users (user_id, username, password, email, postcode) 
VALUES (NULL,'{$username}','{$password}','{$email}','{$postcode}') 

如果值列表完整並按順序,則您也不需要字段列表。結尾分號是不可取的(儘管無效)。


您的代碼很容易被注入。您應該使用正確的參數化查詢與PDO或mysqli

0

你有單引號圍繞你的表和列。你用反引號混淆了這些 - 除非你使用了reserved word(你應該避免使用IMO),否則這些都是不必要的。

此外,你沒有使用你的消毒變量,因此易受SQL injection

INSERT INTO users (user_id, username, password, email, postcode) VALUES (NULL,'{$this->_username}','{$this->_password}','{$this->_email}','{$this->_postcode}'); 

強制性:mysql_*功能將是deprecated in PHP 5.5。不建議編寫新代碼,因爲它將來會被刪除。取而代之的是MySQLiPDObe a better PHP Developer

+0

列名周圍的單引號總是錯誤的。如果你想附上列名,你應該使用反引號。 – Arjan 2013-04-30 21:40:16

+0

看起來像我遺漏了倒退線。查看更新。 – 2013-05-01 01:17:38

0

除了使用預處理語句之外,您絕對應該考慮切換到mysqli。使用準備好的語句將使您的查詢更容易,並進一步保護您免受注射。

http://php.net/manual/en/mysqli.prepare.php

至於你的錯誤,有一些東西是錯誤的。不要使用引號調用數據庫。不要用引號來對待表名。這些都是爆炸藥所指出的。

最後,我沒有看到你在哪裏打開了一個mysqli連接。

相關問題