[PHP]Yii2框架的坑,phpyii2框架_PHP教程
Jul 13, 2016 am 09:44 AM[PHP]Yii2框架的坑,phpyii2框架
Yii2框架的幾個隱蔽的坑
摘要:Yii2是一款優(yōu)秀的通用Web后端框架,結(jié)構(gòu)簡單優(yōu)雅、實(shí)用功能豐富、擴(kuò)展性強(qiáng)、性能搞是他最突出的優(yōu)點(diǎn)。它優(yōu)秀的地方你在使用過程中總能輕易的發(fā)現(xiàn),無須贅述。而這些隱蔽的小瑕疵,顯得更有必要告訴大家。
- 博客: http://www.cnblogs.com/jhzhu
- 郵箱: jhzhuustc@gmail.com
- 作者: 知明所以
- 時(shí)間: 2015-08-17
目錄
- Yii2框架的幾個隱蔽的坑
- 目錄
- 說點(diǎn)閑話
- ActiveRecord被莫名寫入?
- 準(zhǔn)備知識
- 代碼現(xiàn)場
- 總結(jié)問題
- 解決方法
- 你的Transaction生效了嗎?
- 代碼現(xiàn)場
- 問題總結(jié)
- 解決方法
- 'Y-m-d'不被識別?
- 代碼現(xiàn)場
- 問題總結(jié)
說點(diǎn)閑話
距離上次寫博客,已經(jīng)有三個月了。在動手寫之前,總是帶著深深的罪惡感。被它折磨許久,終于,還是,動手了。
值得慶祝的一件事:最近開始,每天早上8:30起來健身了。有兩個視頻很好用,只需8分鐘,照著做一遍保證你(生)爽(不)到(如)爆(死)。(8分鐘腹肌鍛煉第2級-下載,8分鐘胸肌鍛煉第2級-下載)
值得反思的一件事:最近看了《叔本華美學(xué)隨筆》,改變了我一直以來對閱讀的看法。我曾經(jīng)以為閱讀是進(jìn)步的源動力,卻被這本書深深的打臉了。來,先給大家分享一段:
<p>我們只管所見的外在環(huán)境并不像閱讀物那樣,把某已確定的見解強(qiáng)加給我們的頭腦,而只是為我們提供了素材和機(jī)會。去思考與我們的頭腦能力相稱、與當(dāng)下的情緒相符的事情。所以,太多的閱讀會是我們的精神失去彈性,就像把一重物持續(xù)壓在一條彈簧上面就會是彈簧失去彈性一樣;而讓自己沒有自己思想的最穩(wěn)妥的辦法就是在空閑的每一分鐘馬上隨手拿起一本書。</p>
思考才是進(jìn)步的源動力!
好了,扯淡完畢,步入正題。
ActiveRecord被莫名寫入?
準(zhǔn)備知識
代碼現(xiàn)場
<span class="x">/**</span> <span class="x"> * @property integer $id</span> <span class="x"> * @property string $name</span> <span class="x"> * @property string $detail</span> <span class="x"> * @property double $price</span> <span class="x"> * @property integer $area</span> <span class="x"> **/</span> <span class="x">class OcRoom extends ActivieRecord</span> <span class="x">{</span> <span class="x"> ...</span> <span class="x">}</span> <span class="x">$room = OcRoom::find() //先取出一個對象。</span> <span class="x"> ->select(['id']) //只取出'id'列</span> <span class="x"> ->where(['id'=>20])</span> <span class="x"> ->one();</span> <span class="x">$room->save(); //保存,會發(fā)現(xiàn)此行的其它字段都被寫成默認(rèn)值了。</span>
總結(jié)問題
這個例子的問題在于:
解決方法
然而,我們有什么解決辦法呢?提供幾種思路:
你的Transaction生效了嗎?
代碼現(xiàn)場
<span class="x">/**</span> <span class="x"> * @property integer $id</span> <span class="x"> * @property string $name</span> <span class="x"> **/</span> <span class="x">class OcRoom extends ActiveRecord</span> <span class="x">{</span> <span class="x"> public function rules()</span> <span class="x"> {</span> <span class="x"> return [['name','string','min'=>2,'max'=>10]];</span> <span class="x"> }</span> <span class="x"> ...</span> <span class="x">}</span> <span class="x">class OcHouse extends ActiveRecord</span> <span class="x">{</span> <span class="x"> public function rules()</span> <span class="x"> {</span> <span class="x"> return [['name','string','max'=>10]];</span> <span class="x"> }</span> <span class="x"> ...</span> <span class="x">}</span> <span class="x">$a = new OcRoom();</span> <span class="x">$a->name = ''; //name為空字符串,不滿足rules()條件。</span> <span class="x">$b = new OcHouse();</span> <span class="x">$b->name = '我的房間'; //name合法,可以保存。</span> <span class="x">$transaction = Yii::$app->db->beginTransaction();</span> <span class="x">try{</span> <span class="x"> $a->save(); //name字段不合法,無法驗(yàn)證通過,在validate()階段已經(jīng)返回false,不會進(jìn)行數(shù)據(jù)庫存儲的步驟,所以也不會拋出異常。</span> <span class="x"> $b->save(); //name字段合法,可以正常保存。</span> <span class="x"> $transaction->commit(); //提交后,發(fā)現(xiàn)$a保存失敗,而$b保存成功。</span> <span class="x">}</span> <span class="x">catch (Exception $e) </span> <span class="x">{</span> <span class="x"> Yii::error($e->getTraceAsString(),__METHOD__);</span> <span class="x"> $transaction->rollBack();</span> <span class="x">}</span>
問題總結(jié)
這段代碼的問題在于:
解決方法
在$transation
塊內(nèi),所有的save()
都要判斷下返回值,如果為false
,則直接拋出異常。
'Y-m-d'不被識別?
代碼現(xiàn)場
<span class="x">OcRenterBill extends ActiveRecord</span> <span class="x">{</span> <span class="x"> public function rules()</span> <span class="x"> {</span> <span class="x"> return [</span> <span class="x"> ['start_time','date','format'=>'Y-m-d'],</span> <span class="x"> ];</span> <span class="x"> }</span> <span class="x">}</span> <span class="x">$a = new OcRenterBill();</span> <span class="x">$a = '2015-09-12';</span> <span class="x">$a->save(); //會報(bào)錯,說格式不對。</span>
問題總結(jié)
如果一開始,Yii框架就報(bào)錯,這個還不算坑??拥氖俏以贛ac上開發(fā)時(shí),這個可以完全正常的工作,而發(fā)布到線上環(huán)境(Ubuntu)后,就彈出“屬性start_time格式無效”的錯誤。而參考官方文檔,發(fā)現(xiàn)這種格式是允許的官方文檔。
啊啊啊。各種試錯,最后發(fā)現(xiàn)如果改成php:Y-m-d
,世界就清凈了。所以,如果你遇到這種問題,感激我吧。

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.
