]> granicus.if.org Git - php/commitdiff
Add proper magic_quotes_runtime support for mysqlnd, but
authorAndrey Hristov <andrey@php.net>
Thu, 26 Aug 2010 14:51:58 +0000 (14:51 +0000)
committerAndrey Hristov <andrey@php.net>
Thu, 26 Aug 2010 14:51:58 +0000 (14:51 +0000)
in mysqli, so we don't need to tamper myslqnd.
magic_quotes_runtime are deprecated and not existant in 5.4, thus
only fixing in the branch.

ext/mysqli/mysqli.c
ext/mysqlnd/mysqlnd_result.c

index f92ba0cb4976d70e693543e5d5254280530e4b7d..474541fecb298220aa217ec9c1870172a0bd615b 100644 (file)
@@ -1172,6 +1172,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
 
                                /* check if we need magic quotes */
                                if (PG(magic_quotes_runtime)) {
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "magic_quotes_runtime are deprecated since PHP 5.3");
                                        Z_TYPE_P(res) = IS_STRING;
                                        Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC);
                                } else {
@@ -1198,7 +1199,50 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
                }
        }
 #else
-       mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI);
+       if (PG(magic_quotes_runtime)) {
+               HashPosition pos_values;
+               zval **entry_values;
+               zval new_return_value;
+               char * string_key;
+               uint   string_key_len;
+               ulong  num_key;
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "magic_quotes_runtime are deprecated since PHP 5.3");
+
+               array_init(return_value);
+
+               mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), &new_return_value, MYSQLND_MYSQLI);
+
+               zend_hash_internal_pointer_reset_ex(Z_ARRVAL(new_return_value), &pos_values);
+               while (zend_hash_get_current_data_ex(Z_ARRVAL(new_return_value), (void **)&entry_values, &pos_values) == SUCCESS) {
+                       if (Z_TYPE_PP(entry_values) == IS_STRING) {
+                               int new_str_len;
+                               char * new_str = php_addslashes(Z_STRVAL_PP(entry_values), Z_STRLEN_PP(entry_values), &new_str_len, 0 TSRMLS_CC);
+                               switch (zend_hash_get_current_key_ex(Z_ARRVAL(new_return_value), &string_key, &string_key_len, &num_key, 0, &pos_values)) {
+                                       case HASH_KEY_IS_LONG:
+                                               add_index_stringl(return_value, num_key, new_str, new_str_len, 0);
+                                               break;
+                                       case HASH_KEY_IS_STRING:
+                                               add_assoc_stringl_ex(return_value, string_key, string_key_len, new_str, new_str_len, 0);
+                                               break;
+                               }
+                       } else {
+                               zval_add_ref(entry_values);
+                               switch (zend_hash_get_current_key_ex(Z_ARRVAL(new_return_value), &string_key, &string_key_len, &num_key, 0, &pos_values)) {
+                                       case HASH_KEY_IS_LONG:
+                                               add_index_zval(return_value, num_key, *entry_values);
+                                               break;
+                                       case HASH_KEY_IS_STRING:
+                                               add_assoc_zval_ex(return_value, string_key, string_key_len, *entry_values);
+                                               break;
+                               }
+                       }
+                       zend_hash_move_forward_ex(Z_ARRVAL(new_return_value), &pos_values);
+               }
+               zval_dtor(&new_return_value);
+       } else {
+               mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI);
+       }
+
 #endif
 
        if (into_object && Z_TYPE_P(return_value) != IS_NULL) {
index 2079240f64c946bc75a04991285ed29419b2a55b..aca049f83171b974d46b07788bb8554999df14c3 100644 (file)
@@ -1506,6 +1506,9 @@ MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result TSRMLS_
 /* }}} */
 
 
+/* for php_addslashes */
+#include "ext/standard/php_string.h"
+
 /* {{{ mysqlnd_res::fetch_into */
 static void
 MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, unsigned int flags,
@@ -1540,9 +1543,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, unsigned int flags
                                break;
                        default:exit(0);
                }
-       } else if (extension == MYSQLND_MYSQLI && PG(magic_quotes_runtime)) {
-               php_error_docref(NULL TSRMLS_CC, E_ERROR, "magic_quotes_runtime are not supported by mysqlnd. They were deprecated in PHP 5.3 ");
-       }
+       } 
        /*
          return_value is IS_NULL for no more data and an array for data. Thus it's ok
          to return here.