web-dev-qa-db-ja.com

SELECTクエリの結果に対してUPDATEクエリを実行する

レコードを選択した後、そのレコードに対してUPDATEクエリを実行したい。

$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

$query
   ->select(array('p.*', 'u.id', 'u.name' ,'pr.*'))
   ->from($db->quoteName('#__chichi_photos', 'p'))
   ->join('LEFT', $db->quoteName('#__users', 'u') . ' ON (' . $db->quoteName('p.userID') . ' = ' . $db->quoteName('u.id') . ')')
   ->join('LEFT', $db->quoteName('#__chichi_profile', 'pr') . ' ON (' . $db->quoteName('pr.userID') . ' = ' . $db->quoteName('u.id') . ')')
   ->where($db->quoteName('p.id') .'=' . $photoID .'');

$db->setQuery($query);

$results = $db->loadRow();

結果にIDがある#__chichi_photosテーブルのフィールドでUPDATEクエリを実行し、可能であれば、単一のクエリステートメントでそれを実行します。

基本的に私がしたいことは、フィールドが選択された後にフィールドの「ヒット」列を更新することです。ありがとうございました。

1
David Addoteye

最初のクエリからデータをクリアする$query->clear();を使用して、次のようにupdateクエリを使用できます。

$db = JFactory::getDbo();

$query = $db->getQuery(true);

$query
   ->select(array('p.*', 'u.id', 'u.name' ,'pr.*'))
   ->from($db->quoteName('#__chichi_photos', 'p'))
   ->join('LEFT', $db->quoteName('#__users', 'u') . ' ON (' . $db->quoteName('p.userID') . ' = ' . $db->quoteName('u.id') . ')')
   ->join('LEFT', $db->quoteName('#__chichi_profile', 'pr') . ' ON (' . $db->quoteName('pr.userID') . ' = ' . $db->quoteName('u.id') . ')')
   ->where($db->quoteName('p.id') .'=' . $photoID .'');

$db->setQuery($query);

$results = $db->loadRow();


// SECOND PART OF THE QUERY
$query = $db->getQuery(true);
$query->clear();

$fields = array(
    $db->quoteName('hits') . ' = ' . $db->quote($results[0]),
);     
$conditions = array( 
    $db->quoteName('id') . ' = ' . $db->quote($results[1])
);

$query->update($db->quoteName('#__chichi_photos'))
      ->set($fields)
      ->where($conditions);

$db->setQuery($query);

try
{
    $db->execute();
}
catch (RuntimeException $e)
{
    $e->getMessage();
}

おそらく変更する必要があります$results[0]および$results[0]最初のクエリが出力するインデックス。

お役に立てれば

2
Lodder

投稿されたUPDATEコーディングの試みがないため、目的は少し不明確ですが、#__chichi_photos値を使用して$photoIDテーブルのヒットカウントを「インクリメント」することを意図していると思います。

$photoID = 1;                                        // whatever you set it to be
$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->update("#__chichi_photos")
                ->set("hit = hit + 1")               // increment the row's value
                ->where("id = " . (int)$photoID);    // cast as int for security/stability
    echo $query->dump();                             // show yourself the query being run
    $db->setQuery($query);
    $db->execute();
    if ($affrows = $db->getAffectedRows()) {         // check for "logical" success
        echo "Incremented hit count for photo# $photoID";
    } else {                                         // catch "logical" failure
        echo "Failed to increment hit count for photo# $photoID";
    }
} catch (Exception $e) {                             // catch any syntax failures
    echo "Query Syntax Error: " , $e->getMessage();  // never show getMessage() to public
}
0
mickmackusa