2011-08-15 6 views
5

मैं निम्नलिखित है:oci_bind_by_name और TO_DATE PHP/ओसीआई/Oracle

$ARTIFACT_NAME = $_POST['ArtifactName']; 
    $ARTIFACT_TYPE = $_POST['ArtifactType']; 
    $ARTIFACT_LOCATION = $_POST['ArtifactLocation']; 
    $ARTIFACT_DOMAIN = $_POST['ArtifactDomain']; 
    $ARTIFACT_AUTHOR = $_POST['ArtifactAuthor']; 
    $ARTIFACT_LABEL = 'DB_'.$ARTIFACT_LOCATION.'_'.$ARTIFACT_DOMAIN.'_'.$ARTIFACT_NAME; 
    $AUDIT_CONSTRAINTS = $_POST['AuditConstraints']; 
    $SECURITY_CONSTRAINTS = $_POST['SecurityConstraints']; 
    $REGISTERED_EMAIL = $_SERVER['HTTP_REMOTE_USER']; 
    $REGISTERED_TIMESTAMP = "to_date('15-08-2011 14:32:37', 'DD-MM-YYYY HH24:MI:SS')"; 

    $query = "INSERT INTO ".$db_schema.".ARTIFACTS (ARTIFACT_ID, ARTIFACT_NAME, ARTIFACT_TYPE, ARTIFACT_LOCATION, ARTIFACT_DOMAIN, ARTIFACT_AUTHOR, ARTIFACT_LABEL, AUDIT_CONSTRAINTS, SECURITY_CONSTRAINTS, REGISTERED_EMAIL, REGISTERED_TIMESTAMP) 
       VALUES (:bind1, :bind2, :bind3, :bind4, :bind5, :bind6, :bind7, :bind8, :bind9, :bind10, :bind11)"; 
    $statement = oci_parse($connection, $query); 

    oci_bind_by_name($statement, ":bind1", $ARTIFACT_ID); 
    oci_bind_by_name($statement, ":bind2", $ARTIFACT_NAME); 
    oci_bind_by_name($statement, ":bind3", $ARTIFACT_TYPE); 
    oci_bind_by_name($statement, ":bind4", $ARTIFACT_LOCATION); 
    oci_bind_by_name($statement, ":bind5", $ARTIFACT_DOMAIN); 
    oci_bind_by_name($statement, ":bind6", $ARTIFACT_AUTHOR); 
    oci_bind_by_name($statement, ":bind7", $ARTIFACT_LABEL); 
    oci_bind_by_name($statement, ":bind8", $AUDIT_CONSTRAINTS); 
    oci_bind_by_name($statement, ":bind9", $SECURITY_CONSTRAINTS); 
    oci_bind_by_name($statement, ":bind10", $REGISTERED_EMAIL); 
    oci_bind_by_name($statement, ":bind11", $REGISTERED_TIMESTAMP); 

निम्नलिखित में से कौन त्रुटि देता है:

ORA-01858: a non-numeric character was found where a numeric was expected 

हालांकि, अगर मैं सिर्फ $REGISTERED_TIMESTAMP बाध्य नहीं है और to_date सम्मिलित सीधे $query में - यह पूरी तरह से काम करता है।

क्या चल रहा है ?! यह मुझे पागल कर रहा है!

उत्तर

8

आप बाध्य पैरामीटर के साथ ओरेकल स्टेटमेंट का उपयोग कर रहे हैं। यह अच्छा है क्योंकि यह एसक्यूएल इंजेक्शन को रोकता है जहां आपके SQL कथन में खतरनाक कोड डाला जाता है। हालांकि, इस मामले में, यह TO_CHAR फ़ंक्शन निष्पादित होने से रोकता है। इसके बजाए, यह पूरे स्ट्रिंग को टाइमस्टैंप में बदलने की कोशिश करता है, जो निश्चित रूप से 'काम नहीं करता है।

समाधान नहीं बल्कि सीधी-सपाट है: सीधे बयान में बाध्य पैरामीटर से दूर TO_CHAR कार्य करने के लिए ले जाने के:

$REGISTERED_TIMESTAMP = "15-08-2011 14:32:37"; 

$query = "INSERT INTO ".$db_schema.".ARTIFACTS (ARTIFACT_ID, ARTIFACT_NAME, ARTIFACT_TYPE, ARTIFACT_LOCATION, ARTIFACT_DOMAIN, ARTIFACT_AUTHOR, ARTIFACT_LABEL, AUDIT_CONSTRAINTS, SECURITY_CONSTRAINTS, REGISTERED_EMAIL, REGISTERED_TIMESTAMP) 
      VALUES (:bind1, :bind2, :bind3, :bind4, :bind5, :bind6, :bind7, :bind8, 
       :bind9, :bind10, to_date(:bind11, 'DD-MM-YYYY HH24:MI:SS'))"; 
+0

बिल्कुल सही - धन्यवाद! – rwb