PHPcmsv9 get標簽 sql語句limit無效及num和rows屬性無效問題解決辦法
PHPcmsv9 get標簽 sql語句limit無效及num和rows屬性無效問題很多朋友就直接百度了,但發現網上很多朋友也碰到此問題了,下文來給各位整理此問題解決方法.
PHPcms v9 get標簽sql語句limit無效及num和rows屬性無效問題至今也已經是一個老問題了,網絡上也有一些表面的解決辦法,但是逐日者并沒有找到從底層,層模板標簽解析及模板引擎代碼上真正解決此問題的辦法和解釋。今天在使用get標簽sql語句調用數據的時候當然也遇到了此問題,經過研究找到了問題的原因并且整理出本文希望對php愛好者有所幫助。
錯誤描述:我想從數據表中調取最新的6條數據,代碼如下:
- <dl class="about_text1">
- <dt><img src="{get_memberavatar($m_info['userid'],1,45)}" alt=""
- class="tupian"/> {$m_more['nick']}最新文章
- </dt>
- {pc:get sql="SELECT * FROM `cms_talkcar` a LEFT JOIN `cms_member` b
- ON a.username=b.username LEFT JOIN `cms_member_detail` c ON b.userid=c.userid
- WHERE a.catid=$catid AND status=99 and a.username='$username' ORDER BY //開源軟件:Vevb.com
- inputtime DESC" num='8' }
- {loop $data $r}
- <dd><i></i><a href="{$r[url]}" title="" target="_blank">{$r[title]}</a></dd>
- {/loop}
- {/pc}
- </dl>
但結果顯示的數量超過了6條,把數據庫中所有的10條數據都顯示了出來,這說明rows屬性無效.
后來對sql進行了更改:SELECT * FROM `cms_talkcar` a LEFT JOIN `cms_member` b ON a.username=b.username LEFT JOIN `cms_member_detail` c ON b.userid=c.userid WHERE a.catid=$catid AND status=99 and a.username='$username' ORDER BY inputtime DESC limit 0,8"結果系統報出如下sql語法錯誤:
很明顯,這是phpcms系統解析標簽的時候如果沒有獲得有效的指定數據條數的參數時會默認追加“limit 20”的限制量,現在看來簡單的在源sql語句上追加limit 8也是不行的.
逐日者也很快知道了指定數量用num屬性,但是正如網又們知道的,num屬性也無效(為什么num屬性是正確的指定數量的參數在后面的底層代碼講解中您將得到回答)。返回的仍然是系統默認追加的“limit 20”的限制。
如此說明,在解析源代碼地方出現了獲取num屬性值和判斷是否有此值是否要使用默認20的錯誤。
在下面先給出整理的網絡上的解決方法,然后再給大家講解怎樣去除源代碼上的錯誤來正常的使用num屬性指定獲取數據條數。
整理的網絡上的解決方案,來源phpcms官方論壇.
1.方法一,加入start屬性,比如:
{pc:get sql="SELECT title,url FROM v9_news where catid=9 and status=99 order by updatetime desc" start="0" num="4" return="v"}
可以加入start 和 num 來控制,這樣就獲得0到4的數據.
2.方法二(比較絕的方法),加入--將系統自動加上的limit 20注釋掉,代碼如下:
{pc:get sql="SELECT title,url FROM v9_news where catid=9 and status=99 order by updatetime desc limit 0,4--" return="v"}
注意4后面的兩個減號,把v9自帶的LIMIT 0,20語句給注釋了,這樣就不會和你加入的limit 0,4沖突了.
注意4后面的兩個減號,把v9自帶的LIMIT 0,20語句給注釋了!這樣就不會和你加入的limit 0,4沖突了.
逐日者給出的層底層去掉源代碼錯誤的辦法,只要改一行代碼哦,在/phpcms/libs/classes/template_cache.class.php模板解析緩存文件中找到pc_tag()方法,大約在115行左右,然后在如下代碼:
131 $str = '';
132 $num = isset($num) && intval($num) ? intval($num) : 20;
第131行和第132行之間插入一句,如下:
- 131 $str = '';
- 132 $num = eval("return ".$num.";");//插入語句
- 133 $num = isset($num) && intval($num) ? intval($num) : 20;
這樣,大功告成,在后臺更新一下緩存,然后測試一下,get標簽中num屬性指定數據數量就可以用了.
新聞熱點
疑難解答