我一直在打這個這個,我似乎無法自己解決。我遇到了已知的問題/功能與PDO和MYSQL,導致我到下面的代碼。用PDO動態列表查詢
我在數據庫中搜索符合多個條件的標記ID。我遇到了一個MYSQL錯誤,這似乎迫使我在第二次處理之前使用臨時表來存放一些結果。 PDO不會讓我在第一次執行後引用臨時表(我可能做錯了)或讓我準備多個語句,因此它會導致爲此調用創建一個存儲過程。經過一些最近的測試後,我發現了另一個PDO的問題/功能,它不允許我以我正在尋找的方式調用存儲過程。
這裏是SP:
DELIMITER $$
CREATE PROCEDURE sp_searchPrevArticles(IN tagList VARCHAR(255), IN firstArticle INT(10))
BEGIN
CREATE TEMPORARY TABLE at_results (
id INTEGER(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
article_id INTEGER(10) NOT NULL,
datetime DATETIME NOT NULL,
common_tags INTEGER NOT NULL)
SELECT at.article_id, art.datetime, Count(at.article_id) AS common_tags
FROM article_tags AS at
INNER JOIN articles AS art ON at.article_id = art.article_id
WHERE at.tag_id IN (tagList)
GROUP BY at.article_id
ORDER BY common_tags DESC, art.datetime DESC;
CREATE TEMPORARY TABLE at_article
SELECT id
FROM at_results
WHERE article_id = firstArticle;
SELECT article_id
FROM at_results, at_article
WHERE at_results.id < at_article.id
ORDER BY at_results.id DESC;
END $$
DELIMITER ;
是無法正常工作的參數標記列表。我創建tagList與
foreach ($tag_ids as $tag) {
$tag_list = ($tag_list . $tag . ",");
}
$tag_list = rtrim($tag_list, ',');
這給了我一個標籤ID的動態列表。爲此,我們可以說「4,3,2,1」。當我運行這個沒有PDO的SP時,它會返回正確的數據集。任何時候我用PDO運行它,它只會給我列表中的第一個標籤。在這種情況下,它只會返回「4」的結果。
的PDO調用我是:
$sql = "CALL sp_searchPrevArticles(:tag_list, :first_article)";
$tag_sth = $this->db->prepare($sql);
$tag_sth->execute(array(':tag_list' => $tag_list, ':first_article' => $first_article));
$tag_sth->setFetchMode(PDO::FETCH_ASSOC);
$data = $tag_sth->fetchAll();
正如我繼續寫他們這樣,我不禁想,我正在爲自己的一切都變得更加困難。我仍然在學習,這是迄今爲止我提出的最佳解決方案。任何人都有關於如何正確運作的想法?
任何幫助表示讚賞。
謝謝!
我仍然需要兩個聲望來啓動upvoting,否則我會upvote你。 – Alduron
意外命中輸入,我不能編輯該評論。感謝您的答覆。我正在試圖將其納入我的代碼中,但似乎與以前一樣。使$ sql =「CALL sp_searchPrevArticles(%s)」(現在忘記第二個參數)作爲查詢應該工作,對吧? doQuery是否嚴格必要?我對它不是很熟悉,所以我不得不閱讀它。 – Alduron
對不起,'doQuery'是我在PDO幾年前寫的類中的一部分,我只是通過反射來寫它。它只是把'prepare','execute'和'fetch'放到一個語句中。 – Sammitch