2011-08-15 15 views
5

Tengo el siguiente:oci_bind_by_name y to_date PHP/OCI/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); 

que da el siguiente error:

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

Sin embargo, si sólo no se unen $REGISTERED_TIMESTAMP e inserte el to_date en el $query directamente, funciona perfectamente.

¡¿Qué está pasando ?! Esto me está volviendo loco!

Respuesta

8

Está utilizando una declaración de Oracle con parámetros enlazados. Eso es bueno porque evita las inyecciones de SQL donde se inserta código peligroso en su declaración de SQL. Sin embargo, en este caso, impide que se ejecute la función TO_CHAR. En cambio, intenta convertir toda la cadena en una marca de tiempo, lo que por supuesto no funciona.

La solución es bastante recta hacia adelante: mover a TO_CHAR función de distancia del parámetro enlazado directamente en la declaración:

$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

perfecto - gracias! – rwb

Cuestiones relacionadas