2011-08-20 39 views
0

嗯,我正在爲我的網站創建一個註冊系統,但我在執行查詢時遇到了麻煩。我試圖解決問題,但我沒有成功。那種迷茫:(執行我的查詢時發生錯誤

這裏是我的代碼:

public function registerUser($username, $password, $email) { 
      global $core; 
      if(empty($username) || empty($password) || empty($email)) { 
       throw new Exception ('A required field was left blank'); 
      } else { 
       //SQL Query Data 
       $data['username'] = $username; 
       $data['password'] = $core->encrypt($password); 
       $data['email'] = $email; 
       $data['userKey'] = rand(999999, 100000); 
       $data['ip'] = $_SERVER['REMOTE_ADDR']; 
       $data['date'] = time(); 

       //SQL Query 
       $sql = "INSERT INTO `u_userdata` ('user-key', 'username', 'password', 'email', 'register-ip', 'register-date') VALUES (:userKey, :username, :password, :email, :ip, :date)"; 
       $STH = $this->DBH->query($sql); 
       $STH->execute($data); 
      } 
     } 

,這裏是我得到的錯誤:我猜它與查詢錯誤

Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\community\inc\user.inc.php on line 33 

,但我不知道是什麼!

+0

如果您發佈完整的代碼,這將有所幫助。 –

+0

查詢很好,因爲你沒有注入/繼承數據庫實例/類,將它包含在構造函數中...... –

回答

0

你應該在插入查詢使用'引號,而不是'。

「INSERT INTO u_userdatauser-keyusernamepasswordemailregister-ipregister-date)VALUES(:USERKEY,:用戶名,:密碼:電子郵件,IP,:日期)

+0

好吧,那麼我已經改變了這一點,我仍然得到相同的錯誤? – MattehCarter

1

我覺得你有PDO::prepare()PDO::query()混合起來:

它應該是:

$result = $this->DBH->query($sql); 

或者:

$STH = $this->DBH->prepare($sql); 
$STH->execute($data); 

從文檔:

PDO::query()在一個函數調用執行SQL語句, ,返回結果集(如果有的話)由語句作爲 PDOStatement對象物體返回。

如果您打算重複發出相同的語句,或者您需要綁定參數,則通常會使用PDO::prepare()。據我所知,在使用PDO::query()之前,不可能將參數綁定到您的查詢。

注意,與PDO::prepare()既可以使用PDOStatement::bindParam()到參數調用PDOStatement->execute()之前結合,也可以通過這些參數作爲數組到PDOStatement->execute()

您還需要以冒號作爲數組鍵的前綴。所以最終的結果是:

$data[':username'] = $username; 
$data[':password'] = $core->encrypt($password); 
$data[':email'] = $email; 
$data[':userKey'] = rand(999999, 100000); 
$data[':ip'] = $_SERVER['REMOTE_ADDR']; 
data[':date'] = time(); 

//SQL Query 
$sql = "INSERT INTO `u_userdata` ('user-key', 'username', 'password', 'email', 'register-ip', 'register-date') VALUES (:userKey, :username, :password, :email, :ip, :date)"; 
$STH = $this->DBH->prepare($sql); 
$STH->execute($data); 
0

query()函數執行sql語句。你應該使用prepare()函數。 我假設您使用pdo,因爲pdo標籤

$data[':username'] = $username; 
    $data[':password'] = $core->encrypt($password); 
    $data[':email'] = $email; 
    $data[':userKey'] = rand(999999, 100000); 
    $data[':ip'] = $_SERVER['REMOTE_ADDR']; 
    $data[':date'] = time(); 

    //SQL Query 
    $sql = "INSERT INTO `u_userdata` ('user-key', 'username', 'password', 'email', 'register-ip', 'register-date') VALUES (:userKey, :username, :password, :email, :ip, :date)"; 
    $stmt = $this->DBH->prepare($sql); 
    $stmt->execute($data);