2009-03-29 11 views
1

柔軟な更新クエリを作成しようとしています。どのように柔軟な更新クエリの作成

UPDATE persons SET per_password = '2a6445462a09d0743d945ef270b9485b' AND WHERE per_email = '[email protected]'

:私は今、このようなものがあります:

  $lsQuery = "UPDATE `"; 
     $lsQuery .= $psTableName; 
     $lsQuery .= " SET "; 
     foreach($psValues as $lsKey => $lsValue) 
     { 
      $lsQuery .= $lsKey; 
      $lsQuery .= " = '"; 
      $lsQuery .= $lsValue; 
      $lsQuery .= "' AND "; 
     } 
     $lsQuery .= "` "; 
     $lsQuery .= "WHERE "; 
     if(isset($psWhere)){ 
      foreach($psWhere as $lsKey => $lsValue) 
      { 
       $lsQuery .= $lsKey; 
       $lsQuery .= " = '"; 
       $lsQuery .= $lsValue; 
       $lsQuery .= "' AND "; 
      } 
     } 
     $lsQuery = substr($lsQuery,0,(strlen($lsQuery)-5)); 

をしかし、私は、画面上の私のクエリを印刷するとき、私のような何かを得ますこの余分な「AND」を取り除くのですか?

答えて

2

既存のコードを保持したい場合。

$lsWhere = array(); 
foreach($psWhere as $lsKey => $lsValue) 
{ 
    $lsWhere[] = $lsKey." = '".mysql_real_escape_string($lsValue)."'"; 
} 
$lsQuery .= join(" AND ", $lsWhere); 
+0

tnx。私は私の全更新機能を変更する必要のない解決策を探していました。 – sanders

3

私はおそらくで起動したい:

function update($table, $set, $where) { 
    $change = array(); 
    foreach ($set as $k => $v) { 
    $change[] = $k . ' = ' . escape($v); 
    } 
    $conditions = array(); 
    foreach ($where as $k => $v) { 
    $conditions[] = $k . ' = ' . escape($v); 
    } 
    $query = 'UPDATE ' . $table . ' SET ' . 
    implode(', ', $change) . ' WHERE ' . 
    implode(' AND ', $conditions); 
    mysql_query($query); 
    if (mysql_error()) { 
    // deal with it how you wish 
    } 
} 

function escape($v) { 
    if (is_int($v)) { 
    $v = intval($v); 
    } else if (is_numeric($v)) { 
    $v = floatval($v); 
    } else if (is_null($v) || strtolower($v) == 'null') { 
    $v = 'null'; 
    } else { 
    $v = "'" . mysql_real_escape_string($v) . "'"; 
    } 
    return $v; 
} 
+0

私はZend Frameworkのようなものにアクセスできない場合、これと似たようなものを使います。 –

0

それは私が特に誇りに思っている解決策ではないのですが、あなたは常に$lsQuery .= 'someField=someField'を追加することができます。

+0

申し訳ありませんが、私はあなたが意味することを理解していません。 – sanders

+0

@tstenner:あなたはその質問を誤解していると思います。 @sandersは、WHERE節ではなく、SET節でANDを取り除く方法を尋ねています。 –

+0

私の答えでは、結果のクエリは "[..] SET per_password = '何か'とsomeField = someField WHERE field1 = 1 [..]"でしたので、WHERE句は影響を受けません。 – tstenner

関連する問題