@@ -877,31 +877,39 @@ private function aggregate($aggregate, $column): mixed
877877 */
878878 private function bind (PDOStatement $ pdo_statement , array $ bindings = []): void
879879 {
880- foreach ($ bindings as $ key => $ value ) {
881- if (is_null ($ value ) || strtolower ((string ) $ value ) === 'null ' ) {
882- $ key_binding = ': ' . $ key ;
883- $ pdo_statement ->bindValue ($ key_binding , $ value , PDO ::PARAM_NULL );
884- unset($ bindings [$ key ]);
880+ // Detect if the SQL uses positional or named placeholders
881+ $ sql = $ pdo_statement ->queryString ;
882+ $ uses_named = strpos ($ sql , ': ' ) !== false ;
883+
884+ if ($ uses_named ) {
885+ // Named placeholders
886+ foreach ($ bindings as $ key => $ value ) {
887+ $ param = PDO ::PARAM_STR ;
888+ if (is_null ($ value ) || strtolower ((string ) $ value ) === 'null ' ) {
889+ $ param = PDO ::PARAM_NULL ;
890+ } elseif (is_int ($ value )) {
891+ $ param = PDO ::PARAM_INT ;
892+ } elseif (is_resource ($ value )) {
893+ $ param = PDO ::PARAM_LOB ;
894+ }
895+ $ key_binding = is_string ($ key ) ? ": $ key " : $ key + 1 ;
896+ $ pdo_statement ->bindValue ($ key_binding , $ value , $ param );
885897 }
886- }
887-
888- foreach ( $ bindings as $ key => $ value ) {
889- $ param = PDO :: PARAM_STR ;
890-
891- if (is_int ($ value )) {
892- $ value = ( int ) $ value ;
893- $ param = PDO :: PARAM_INT ;
894- } elseif ( is_float ( $ value )) {
895- $ value = ( float ) $ value;
896- } elseif ( is_double ( $ value )) {
897- $ value = ( float ) $ value ;
898- } elseif ( is_resource ( $ value)) {
899- $ param = PDO :: PARAM_LOB ;
898+ } else {
899+ // Positional placeholders
900+ $ i = 1 ;
901+ foreach ( $ bindings as $ value ) {
902+ $ param = PDO :: PARAM_STR ;
903+ if (is_null ($ value ) || strtolower (( string ) $ value ) === ' null ' ) {
904+ $ param = PDO :: PARAM_NULL ;
905+ } elseif ( is_int ( $ value )) {
906+ $ param = PDO :: PARAM_INT ;
907+ } elseif ( is_resource ( $ value)) {
908+ $ param = PDO :: PARAM_LOB ;
909+ }
910+ $ pdo_statement -> bindValue ( $ i , $ value, $ param );
911+ $ i ++ ;
900912 }
901-
902- // Bind by value with native pdo statement object
903- $ key_binding = is_string ($ key ) ? ": " . $ key : $ key + 1 ;
904- $ pdo_statement ->bindValue ($ key_binding , $ value , $ param );
905913 }
906914 }
907915
0 commit comments