@@ -678,11 +678,20 @@ PHP_METHOD(PDO, inTransaction)
678
678
}
679
679
/* }}} */
680
680
681
- /* TODO: Make distinction between numeric and non-numeric strings */
682
- #define PDO_LONG_PARAM_CHECK \
683
- if (Z_TYPE_P(value) != IS_LONG && Z_TYPE_P(value) != IS_STRING && Z_TYPE_P(value) != IS_FALSE && Z_TYPE_P(value) != IS_TRUE) { \
684
- zend_type_error("Attribute value must be of type int for selected attribute, %s given", zend_zval_type_name(value)); \
685
- return false; \
681
+ #define PDO_GET_LONG_PARAM (zval ) \
682
+ switch (Z_TYPE_P(zval)) { \
683
+ case IS_LONG: \
684
+ case IS_TRUE: \
685
+ case IS_FALSE: \
686
+ lval = zval_get_long(zval); \
687
+ break; \
688
+ case IS_STRING: \
689
+ if (IS_LONG == is_numeric_str_function(Z_STR_P(zval), &lval, NULL)) { \
690
+ break; \
691
+ } \
692
+ /* fallthrough */ \
693
+ default : \
694
+ zend_type_error ("Attribute value must be of type int for selected attribute, %s given" , zend_zval_type_name (zval )); \
686
695
} \
687
696
688
697
/* Return false on failure, true otherwise */
@@ -692,8 +701,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
692
701
693
702
switch (attr ) {
694
703
case PDO_ATTR_ERRMODE :
695
- PDO_LONG_PARAM_CHECK ;
696
- lval = zval_get_long (value );
704
+ PDO_GET_LONG_PARAM (value );
697
705
switch (lval ) {
698
706
case PDO_ERRMODE_SILENT :
699
707
case PDO_ERRMODE_WARNING :
@@ -707,8 +715,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
707
715
return false;
708
716
709
717
case PDO_ATTR_CASE :
710
- PDO_LONG_PARAM_CHECK ;
711
- lval = zval_get_long (value );
718
+ PDO_GET_LONG_PARAM (value );
712
719
switch (lval ) {
713
720
case PDO_CASE_NATURAL :
714
721
case PDO_CASE_UPPER :
@@ -722,8 +729,8 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
722
729
return false;
723
730
724
731
case PDO_ATTR_ORACLE_NULLS :
725
- PDO_LONG_PARAM_CHECK ;
726
- dbh -> oracle_nulls = zval_get_long ( value ) ;
732
+ PDO_GET_LONG_PARAM ( value ) ;
733
+ dbh -> oracle_nulls = lval ;
727
734
return true;
728
735
729
736
case PDO_ATTR_DEFAULT_FETCH_MODE :
@@ -735,10 +742,10 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
735
742
return false;
736
743
}
737
744
}
745
+ lval = zval_get_long (value );
738
746
} else {
739
- PDO_LONG_PARAM_CHECK ;
747
+ PDO_GET_LONG_PARAM ( value ) ;
740
748
}
741
- lval = zval_get_long (value );
742
749
if (lval == PDO_FETCH_USE_DEFAULT ) {
743
750
zend_value_error ("Fetch mode must be a bitmask of PDO::FETCH_* constants" );
744
751
return false;
@@ -747,8 +754,8 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
747
754
return true;
748
755
749
756
case PDO_ATTR_STRINGIFY_FETCHES :
750
- PDO_LONG_PARAM_CHECK ;
751
- dbh -> stringify = zval_get_long ( value ) ? 1 : 0 ;
757
+ PDO_GET_LONG_PARAM ( value ) ;
758
+ dbh -> stringify = lval ? 1 : 0 ;
752
759
return true;
753
760
754
761
case PDO_ATTR_STATEMENT_CLASS : {
0 commit comments