]> granicus.if.org Git - php/commitdiff
Fix for bug #49965 . Let mysqli_options() try to cast option values to the appropriat...
authorUlf Wendel <uw@php.net>
Tue, 3 Nov 2009 14:56:04 +0000 (14:56 +0000)
committerUlf Wendel <uw@php.net>
Tue, 3 Nov 2009 14:56:04 +0000 (14:56 +0000)
ext/mysqli/mysqli_api.c
ext/mysqli/tests/mysqli_options.phpt

index 4061d0975783191a42d47cc4e6a54ff88c49cf50..d79e1226f505ef242859343fa64b569a81809be9 100644 (file)
@@ -1589,6 +1589,66 @@ PHP_FUNCTION(mysqli_num_rows)
 }
 /* }}} */
 
+/* {{{ mysqli_options_get_option_zval_type */
+static int mysqli_options_get_option_zval_type(int option)
+{
+       switch (option) {
+#ifdef MYSQLI_USE_MYSQLND
+#if PHP_MAJOR_VERSION >= 6
+               case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE:
+#endif
+               case MYSQLND_OPT_NET_CMD_BUFFER_SIZE:
+               case MYSQLND_OPT_NET_READ_BUFFER_SIZE:
+#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+               case MYSQLND_OPT_INT_AND_FLOAT_NATIVE:
+#endif
+#endif /* MYSQLI_USE_MYSQLND */
+               case MYSQL_OPT_CONNECT_TIMEOUT:
+                case MYSQL_REPORT_DATA_TRUNCATION:
+                case MYSQL_OPT_LOCAL_INFILE:
+                case MYSQL_OPT_NAMED_PIPE:
+#ifdef MYSQL_OPT_PROTOCOL
+                case MYSQL_OPT_PROTOCOL:
+#endif /* MySQL 4.1.0 */
+#ifdef MYSQL_OPT_READ_TIMEOUT
+               case MYSQL_OPT_READ_TIMEOUT:
+               case MYSQL_OPT_WRITE_TIMEOUT:
+               case MYSQL_OPT_GUESS_CONNECTION:
+               case MYSQL_OPT_USE_EMBEDDED_CONNECTION:
+               case MYSQL_OPT_USE_REMOTE_CONNECTION:
+               case MYSQL_SECURE_AUTH:
+#endif /* MySQL 4.1.1 */
+#ifdef MYSQL_OPT_RECONNECT
+               case MYSQL_OPT_RECONNECT:
+#endif /* MySQL 5.0.13 */
+#ifdef MYSQL_OPT_SSL_VERIFY_SERVER_CERT
+                case MYSQL_OPT_SSL_VERIFY_SERVER_CERT:
+#endif /* MySQL 5.0.23 */
+#ifdef MYSQL_OPT_COMPRESS
+               case MYSQL_OPT_COMPRESS:
+#endif /* mysqlnd @ PHP 5.3.2 */
+                       return IS_LONG;
+
+#ifdef MYSQL_SHARED_MEMORY_BASE_NAME
+                case MYSQL_SHARED_MEMORY_BASE_NAME:
+#endif /* MySQL 4.1.0 */
+#ifdef MYSQL_SET_CLIENT_IP
+               case MYSQL_SET_CLIENT_IP:
+#endif /* MySQL 4.1.1 */
+               case MYSQL_READ_DEFAULT_FILE:
+               case MYSQL_READ_DEFAULT_GROUP:
+               case MYSQL_INIT_COMMAND:
+               case MYSQL_SET_CHARSET_NAME:
+               case MYSQL_SET_CHARSET_DIR:
+                       return IS_STRING;
+
+               default:
+                       return IS_NULL;
+       }
+}
+/* }}} */
+
+
 /* {{{ proto bool mysqli_options(object link, int flags, mixed values)
    Set options */
 PHP_FUNCTION(mysqli_options)
@@ -1599,6 +1659,7 @@ PHP_FUNCTION(mysqli_options)
        long                    mysql_option;
        unsigned int    l_value;
        long                    ret;
+       int                             expected_type;
 
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) {
                return;
@@ -1610,16 +1671,30 @@ PHP_FUNCTION(mysqli_options)
                        RETURN_FALSE;
                }
        }
-
-       switch (Z_TYPE_PP(&mysql_value)) {
+       expected_type = mysqli_options_get_option_zval_type(mysql_option);
+       if (expected_type != Z_TYPE_P(mysql_value)) {
+               switch (expected_type) {
+                       case IS_STRING:
+                               convert_to_string_ex(&mysql_value);
+                               break;
+                       case IS_LONG:
+                               convert_to_long_ex(&mysql_value);
+                               break;
+                       default:
+                               break;
+               }
+       }
+       switch (expected_type) {
                case IS_STRING:
                        ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value));
                        break;
-               default:
-                       convert_to_long_ex(&mysql_value);
+               case IS_LONG:
                        l_value = Z_LVAL_PP(&mysql_value);
                        ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);
                        break;
+               default:
+                       ret = 1;
+                       break;
        }
 
        RETURN_BOOL(!ret);
index 1ca3a34a15e6e59e22d8cb2436fe6d3505f4ce68..1da140b3973ebc71fc13b743a4b08e9fcc9f663d 100644 (file)
@@ -111,6 +111,8 @@ bool(true)
 bool(true)
 %s(23) "MYSQLI_OPT_LOCAL_INFILE"
 bool(true)
+
+Notice: Array to string conversion in %s on line %d
 %s(19) "MYSQLI_INIT_COMMAND"
 bool(true)
 %s(25) "MYSQLI_READ_DEFAULT_GROUP"