في كولد فيوجن, كيف يمكنني استخراج وتخزين محتويات قدمت النموذج ؟

StackOverflow https://stackoverflow.com/questions/506242

سؤال

أنا أكتب تطبيق في كولد فيوجن ، على الرغم من أنها في معظمها مستقرة ، أخطاء كل ذلك في كثير من الأحيان.لأنها حلت محل القديمة التطبيق بالفعل, بعض المستخدمين الذين يحصلون على الأخطاء بدلا مني.

لقد قمت بإنشاء صفحة لطيفة أن الناس الحصول على عندما تحصل على خطأ أن يرسل لي مثل خطأ, المرجع, خطأ على أي صفحة رقم السطر ، إلخ.

الشيء الوحيد الذي لا أستطيع أن يبدو أن العمل هو الحصول على شكل البيانات المقدمة إذا كان هناك أي.أنا لا أعرف ماذا صفحة errored مسبقا لذا لا أستطيع إخراج '#شكل.ميدان#'.

على سبيل المثال إذا كان:

form.abc = 1
form.def = 2

كيف يمكنني الحصول على أسماء المتغيرات و قيمة من 'شكل' من دون معرفة لهم مسبقا ؟

هو هذه الوثيقة على حلقات أكثر من هيكل في مكان ما على طول الطريق الصحيح ؟

أيضا, أنا أبحث عن وسيلة جيدة لتخزين البيانات في قاعدة البيانات ، لأن هذا هو المكان معلومات أخرى عن الخطأ المخزنة ، أنا حقا لا أريد أن أضعها في البريد الالكتروني لي.

هل كانت مفيدة؟

المحلول

شكل نطاق لديه FieldNames المتغير الذي سوف اقول لكم ما حقول قدمت.

يمكنك أيضا القيام StructKeyList(Form) للحصول على قائمة من المتغيرات الحالية في نطاق.هذا واحد سوف تشمل أيضا FieldNames وغيرها من المتغيرات التي تم إضافتها إلى النموذج نطاق.

أي من هذه يمكن استخدامها داخل <cfloop index="CurField" list="#StructKeyList(Form)#"> - ولكن هناك طرق أسهل...


إذا كنت على CF8 يمكنك تحويل نطاق سلسلة جميلة و بسهولة مع serializeJson() و deserializeJson() الوظائف التي يمكن تخزينها في قاعدة بيانات مناسبة الميدانية.

إذا كنت على CF6..7 ثم يمكنك تحميل مركبات الكربون الكلورية فلورية يسمى cfjson من riaforge الذي يحاكي هذه الوظائف.


أخيرا, إذا كنت على الإصدارات السابقة من را ، أو فردي النفور باستخدام JSON لتخزين يمكنك لفة الخاص بك حتى مع أبسط حلقة واحدة ألمح سبق - جمع حلقة يتيح لك حلقة مباشرة من خلال هيكل أو نطاق علما أن بعض شخص مزعج اختار 'العنصر' بدلا من 'مؤشر' باعتبارها سمة هذه.

وبما أننا نعرف شكل المتغيرات كلها أشياء بسيطة (أيسلاسل) لقد انتخب الأساسية key=value[newline]key=value[newline]... شكل سهل عكس أيضا.

ترميز:

<cfset Output = '' />
<cfloop item="CurField" collection="#Form#">
    <cfset Output = Output & CurField & '=' & Form[CurField] & Chr(10) />
</cfloop>

<cfoutput>#Output#</cfoutput>

فك التشفير:

<cfset FormData = StructNew()/>
<cfloop index="CurLine" list="#Output#" delimiters="#Chr(10)#">
    <cfset FormData[ListFirst(CurLine,'=')] = ListRest(CurLine,'=') />
</cfloop>

<cfdump var="#FormData#"/>


واحد آخر ملاحظة هامة:كما هو الحال مع جميع الموفر من قبل المستخدم المتغيرات (شكل,Url,كوكي نطاقات) يجب التأكد من يمكنك التعامل معها بشكل صحيح لمنع الثغرات الأمنية - على وجه التحديد تأكد من أنك تستخدم cfqueryparam على كل استعلامات قاعدة البيانات الخاصة بك - لا أريد أن انحرف بعيدا جدا, ولكن لا تتردد في طرح سؤال آخر إذا كنت بحاجة إلى أي مساعدة مع cfqueryparam.


ويساعد هذا الأمل.:)

نصائح أخرى

إذا كنت تريد يدويا تكرار عبر كل حقول النموذج ، فإن أبسط طريقة هي cfloop مثل ذلك:

<cfloop collection="#form#" item="variables.name">
  #variables.name#=(#form[variables.name]#)<br/>
</cfloop>

ولكن لأغراض خطأ البريد الإلكتروني, وربما كنت سوف تجد أنه من الأسهل أن "تفريغ" شكل نطاق (الذي هو مجرد هيكل خاص) مثل هذا:

<cfmail
  from="errors@#cgi.server_name#"
  to="you@yourdomain.com"
  subject="Error Occurred in such and such a place"
  type="html">
    <cfdump var="#form#"/>
</cfmail>

عند إرسال خطأ رسائل البريد الإلكتروني ، أود أن تشمل الثانية cfdump ل CGI نطاق (مرة أخرى ، فقط خاصة البنية) وهذا يمكن أن توفر بعض المعلومات المفيدة حول الطلب.

إذا كان لديك CF 8, قد ترغب أيضا في تفريغ في شكل النص ، مثل ما يلي ، لأن ذلك سيجعل الرسالة حجم أصغر (و في رأيي جعل الرسالة أكثر قابلية للقراءة)

<cfdump var="#form#" format="text">

ملاحظة:على format السمة CFDump تمت إضافة علامة ل CF 8, حتى أنك لن تكون قادرا على استخدامها في الإصدارات السابقة من كولد فيوجن.

أنت ذكرت أنك كنت تبحث عن وسيلة لتخزين هذه الأخطاء في قاعدة البيانات, و هذا هو فكرة جيدة.بدلا من المتداول المخصصة الخاصة بك حل لذلك, أقترح عليك تحقق BugLogHQ.قد حول لفترة من الوقت و يعمل بشكل جيد للآخرين ، بما في ذلك لي, وأفضل للجميع انها مجانا و مفتوحة المصدر.إنه عمر و استخدام على نطاق واسع يعني أنه سيكون أقل احتمالا أن تحتوي على أخطاء في التعليمات البرمجية الخاصة به و ربما أكثر, ميزات أفضل من ما كنت أكتب.

باستخدام BugLogHQ, كنت لا داعي للقلق حول عرض الخطأ, يمكنك فقط إرسال البيانات إلى علة مسجل فإنه يأخذ الرعاية من بقية.

وForm هو مجرد بعثرة / هيكل، حتى تتمكن من تكرار فقط من خلال مفاتيحها:

<cfoutput>
 <cfloop collection=#form# item="field">
  #htmleditformat(field)=#htmleditformat(form[field])#<br/>
 </cfloop>
</cfoutput>

ووضع البيانات في قاعدة البيانات؟ كيف يمكنك أن تفعل ذلك يعتمد على ما تريد القيام به معه بعد ذلك. قد يكون الحل الأكثر مرونة لمجرد تحويل كل من formurl) إلى كائن WDDX، وتخزين تلك في حقل النقطة:

<cfwddx action="cfml2wddx" input=#url# output="encodedURL"/>
<cfwddx action="cfml2wddx" input=#form# output="encodedForm"/>
<cfquery datasource="yourDSN">
 INSERT INTO errorlog (datestamp, event, script_name, path_info, url, form)
 VALUES
  (<cfqueryparam value=#now()# cfsqltype="CF_SQL_TIMESTANP"/>,
   <cfqueryparam value="your error string or cfcatch data" cfsqltype="CF_SQL_VARCHAR"/>,
   <cfqueryparam value=#cgi.script_name# cfsqltype="CF_SQL_VARCHAR"/>,
   <cfqueryparam value=#cgi.path_info# cfsqltype="CF_SQL_VARCHAR"/>,
   <cfqueryparam value=#encodedURL# cfsqltype="CF_SQL_BLOB"/>,
   <cfqueryparam value=#encodedForm# cfsqltype="CF_SQL_BLOB"/>)
</cfquery>

وبهذه الطريقة سيكون لديك الوصول إلى جميع البيانات الخام لتحليلها في وقت فراغك. الكثير من الطرق الأخرى للذهاب نحو ذلك، بطبيعة الحال.

وإذا كنت تستخدم Application.cfc في التطبيق الخاص بك، مجرد استبدال طريقة onError مع واحد أدناه. ملاحظة: application.settings.mode يمكن أن تكون واحدة من القيم التالية (ديف، اختبار، همز). يجب تعيين application.settings.webmasteremail إلى عنوان البريد الإلكتروني الذي تريد معلومات الخطأ بالبريد. كل من هذه المتغيرات يجب تعيين في طريقة onApplicationStart.

وماذا هذه الوظيفة تفعل؟ إذا تم تعيين التطبيق لوضع "ديف" (عن طريق وضع application.settings.mode = "ديف") أنه سيتم عرض معلومات الخطأ التي تظهر على الشاشة. إذا تم تعيين التطبيق إلى أي وسيلة أخرى (مثل اختبار أو همز) سوف البريد الإلكتروني وتخزين المعلومات في قاعدة بيانات.

<cffunction name="onError" returnType="void" output="true">
    <cfargument name="exception" required="true">
    <cfargument name="eventname" type="string" required="true">
    <!--- corrects bug where <cfabort> throw an error --->
    <cfif arguments.exception.rootCause eq "coldfusion.runtime.AbortException">
        <cfreturn>
    </cfif>
    <cfsavecontent variable="errordata">
        <p>#eventname#</p>
        <cfdump var="#exception#" label="Exception Information" format="text">
        <cfdump var="#url#" label="URL Information" format="text">
        <cfdump var="#form#" label="FORM Information" format="text">
        <cfdump var="#application#" label="Application Scope" format="text">
        <cfif isdefined("session")>
            <cfdump var="#session#" label="Session Scope" format="text">
        </cfif>
        <cfif isdefined("client")>
            <cfdump var="#client#" label="Client Scope" format="text">
        </cfif>
        <cfdump var="#cgi#" label="URL Information" format="text">
    </cfsavecontent>

    <!--- will email the error inforation and display the error page --->
    <cfif application.settings.mode eq "dev">
        <p>#eventname#</p>
        #errordata#
    <cfelse>
        <cfmail to="#application.settings.webmasteremail#" from="error@#cgi.http_host#" subject="Error has occured on #cgi.http_host#" type="HTML" charset="windows-1252">
        <p>#eventname#</p>
        #errordata#
        </cfmail>

        <cfquery datasource="yourDSN">
        insert into errorlog
        (
            creationdate
            ,event
            ,info
        )
        values
        (
            <cfqueryparam value="#now()#" cfsqltype="CF_SQL_TIMESTAMP"/>
            ,<cfqueryparam value="#eventname#" cfsqltype="CF_SQL_VARCHAR"/>
            ,<cfqueryparam value="#errordata#" cfsqltype="CF_SQL_LONGVARCHAR"/>
        )
        </cfquery>

        <h2>A functional error has occurred.</h2>
        <p>A notification of this error has been automatically e-mailed to the development team; no action on your part is required.</p>
        <p>Please click the "back" button on your browser to return to the web site.  We apologize for this inconvenience.</p>
    </cfif>
</cffunction>

إذا كنت البريد الإلكتروني نفسك متغيرات النموذج، مجرد تفريغ لهم، كما يلي:

<cfmail type="html" ...>
    <cfdump var="#form#" label="form">
    <cfdump var="#cgi#" label="cgi">
    <cfdump var="#session#" label="session">
</cfmail>

ويمكنك التخلص من كل ما نطاقات تريد في هناك. كنت قد تكون أو لا تحتاج تلك I المقدمة.

وقال أن المشكلة الأولي هو أن تطبيق واستبدال التطبيق القديم؟ هل وضع على نفس الخادم الذي يتم نشر على؟ إذا كان الأمر كذلك، يمكنك تغيير فقط اسم التطبيق لنسخة التطوير - تأكد من أن أسماء هي فريدة من نوعها لتجنب هذه المشكلة (إذا كان هذا هو ما هي مشكلتك)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top