2012-02-14 52 views
1

我試圖將md5(ID)與id進行匹配。Propel ORM - 自定義where子句

SELECT * 
FROM `user` u 
WHERE 
MD5(`user_id`) = '66f041e16a60928b05a7e228a89c3799' 

這是ID = 58

我想是這樣的。我知道我很接近我只是不知道我在想什麼

$criteria = new Criteria(); 
$criteria->addAnd('md5('.User::USER_ID.')', $_REQUEST['fs'], Criteria::CUSTOM); 
$user = UserPeer::doSelectOne($criteria); 

任何想法?

回答

1

lenghty牛逼&Ë過程後,我設法把它做這樣

$c = new Criteria(); 
$c->add(UserPeer::USER_ID, "md5(user.user_id) = \"".$_REQUEST['fs']."\"", Criteria::CUSTOM); // risk of SQL injection!! 
$saved_search = UserPeer::doSelectOne($c); 

出於某種原因PropelORM儘管這$ _REQUEST [「FS」]是表,而不是價值的名稱。 \「」解決了這個問題。

+0

爲什麼不把散列值本地化爲一個新的var,然後將它傳遞給criteria對象?本地化:'$ userPassword = md5($ _ REQUEST ['fs']);'然後傳遞給criteria對象:'$ c-> add(UserPeer :: USER_PASSWORD,$ userPassword,Criteria :: EQUALS);'順便說一下,如果你這樣做,你不必擔心sql注入,因爲散列字符串將被傳遞,而不是被散列的實際值。 – 2012-02-16 06:22:25

+0

由於密碼是明文,我想要MD5(密碼)字段進行比較。這只是一個例子,我不用純文本存儲密碼。 – Luke 2012-02-16 18:50:29

+0

同意的純文本密碼是一個壞主意。但是,在發送到查詢之前,您可以進行散列,以便與數據庫中的散列進行比較。 – 2012-02-16 19:04:13

3

首先,直接使用Criteria對象是 已棄用 不推薦。你應該使用Active Query classes

使用這些類,您就可以寫這樣的東西:

UserQuery::create() 
    ->where('md5(User.Password) = ?', $_REQUEST['fs'], PDO::PARAM_STR)             
    ->findOne(); 

你會發現,我用的是PhpName的表都和查詢列。

編輯:對於原始條件,必須指定參數類型。你可以在this issue找到更多的信息。

+0

帶有消息的未捕獲異常'PropelException'無法確定要綁定到子句中的參數的列'md5(User.PASSWORD)=?' – Luke 2012-02-16 05:43:23

+1

標準對象已被棄用?猜猜我需要讓工作人員知道... – 2012-02-16 06:23:25

+1

不再推薦,不推薦使用。 – 2012-02-16 09:46:44