Skip to content

Commit 790286a

Browse files
committed
ext/pdo: Pass argument number to pdo_dbh_attribute_set()
1 parent b6febd1 commit 790286a

File tree

4 files changed

+23
-23
lines changed

4 files changed

+23
-23
lines changed

ext/pdo/pdo_dbh.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
#include "zend_observer.h"
3636
#include "zend_extensions.h"
3737

38-
static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value);
38+
static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value, uint32_t value_arg_num);
3939

4040
void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error)
4141
{
@@ -512,7 +512,7 @@ PDO_API void php_pdo_internal_construct_driver(INTERNAL_FUNCTION_PARAMETERS, zen
512512
ZVAL_DEREF(attr_value);
513513

514514
/* TODO: Should the constructor fail when the attribute cannot be set? */
515-
pdo_dbh_attribute_set(dbh, long_key, attr_value);
515+
pdo_dbh_attribute_set(dbh, long_key, attr_value, 3);
516516
} ZEND_HASH_FOREACH_END();
517517
}
518518

@@ -814,7 +814,7 @@ PDO_API bool pdo_get_bool_param(bool *bval, const zval *value)
814814
}
815815

816816
/* Return false on failure, true otherwise */
817-
static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /* {{{ */
817+
static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value, uint32_t value_arg_num) /* {{{ */
818818
{
819819
zend_long lval;
820820
bool bval;
@@ -831,7 +831,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
831831
dbh->error_mode = lval;
832832
return true;
833833
default:
834-
zend_value_error("Error mode must be one of the PDO::ERRMODE_* constants");
834+
zend_argument_value_error(value_arg_num, "Error mode must be one of the PDO::ERRMODE_* constants");
835835
return false;
836836
}
837837
return false;
@@ -847,7 +847,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
847847
dbh->desired_case = lval;
848848
return true;
849849
default:
850-
zend_value_error("Case folding mode must be one of the PDO::CASE_* constants");
850+
zend_argument_value_error(value_arg_num, "Case folding mode must be one of the PDO::CASE_* constants");
851851
return false;
852852
}
853853
return false;
@@ -865,7 +865,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
865865
zval *tmp;
866866
if ((tmp = zend_hash_index_find(Z_ARRVAL_P(value), 0)) != NULL && Z_TYPE_P(tmp) == IS_LONG) {
867867
if (Z_LVAL_P(tmp) == PDO_FETCH_INTO || Z_LVAL_P(tmp) == PDO_FETCH_CLASS) {
868-
zend_value_error("PDO::FETCH_INTO and PDO::FETCH_CLASS cannot be set as the default fetch mode");
868+
zend_argument_value_error(value_arg_num, "PDO::FETCH_INTO and PDO::FETCH_CLASS cannot be set as the default fetch mode");
869869
return false;
870870
}
871871
}
@@ -876,7 +876,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
876876
}
877877
}
878878
if (lval == PDO_FETCH_USE_DEFAULT) {
879-
zend_value_error("Fetch mode must be a bitmask of PDO::FETCH_* constants");
879+
zend_argument_value_error(value_arg_num, "Fetch mode must be a bitmask of PDO::FETCH_* constants");
880880
return false;
881881
}
882882
dbh->default_fetch_type = lval;
@@ -906,25 +906,25 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
906906
return false;
907907
}
908908
if (Z_TYPE_P(value) != IS_ARRAY) {
909-
zend_type_error("PDO::ATTR_STATEMENT_CLASS value must be of type array, %s given",
909+
zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS value must be of type array, %s given",
910910
zend_zval_value_name(value));
911911
return false;
912912
}
913913
if ((item = zend_hash_index_find(Z_ARRVAL_P(value), 0)) == NULL) {
914-
zend_value_error("PDO::ATTR_STATEMENT_CLASS value must be an array with the format "
914+
zend_argument_value_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS value must be an array with the format "
915915
"array(classname, constructor_args)");
916916
return false;
917917
}
918918
if (Z_TYPE_P(item) != IS_STRING || (pce = zend_lookup_class(Z_STR_P(item))) == NULL) {
919-
zend_type_error("PDO::ATTR_STATEMENT_CLASS class must be a valid class");
919+
zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS class must be a valid class");
920920
return false;
921921
}
922922
if (!instanceof_function(pce, pdo_dbstmt_ce)) {
923-
zend_type_error("PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement");
923+
zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement");
924924
return false;
925925
}
926926
if (pce->constructor && !(pce->constructor->common.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED))) {
927-
zend_type_error("User-supplied statement class cannot have a public constructor");
927+
zend_argument_type_error(value_arg_num, "User-supplied statement class cannot have a public constructor");
928928
return false;
929929
}
930930
dbh->def_stmt_ce = pce;
@@ -934,7 +934,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /
934934
}
935935
if ((item = zend_hash_index_find(Z_ARRVAL_P(value), 1)) != NULL) {
936936
if (Z_TYPE_P(item) != IS_ARRAY) {
937-
zend_type_error("PDO::ATTR_STATEMENT_CLASS constructor_args must be of type ?array, %s given",
937+
zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS constructor_args must be of type ?array, %s given",
938938
zend_zval_value_name(value));
939939
return false;
940940
}
@@ -980,7 +980,7 @@ PHP_METHOD(PDO, setAttribute)
980980
PDO_DBH_CLEAR_ERR();
981981
PDO_CONSTRUCT_CHECK;
982982

983-
RETURN_BOOL(pdo_dbh_attribute_set(dbh, attr, value));
983+
RETURN_BOOL(pdo_dbh_attribute_set(dbh, attr, value, 2));
984984
}
985985
/* }}} */
986986

ext/pdo/tests/bug_44159.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ foreach ($attrs as $attr) {
4040

4141
?>
4242
--EXPECT--
43-
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, null given
44-
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, int given
45-
TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
43+
TypeError: PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, null given
44+
TypeError: PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, int given
45+
TypeError: PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
4646
TypeError: Attribute value must be of type bool for selected attribute, null given
4747
bool(true)
4848
TypeError: Attribute value must be of type bool for selected attribute, string given

ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ error_reporting=E_ALL
158158
TypeError: Attribute value must be of type int for selected attribute, array given
159159
TypeError: Attribute value must be of type int for selected attribute, stdClass given
160160
TypeError: Attribute value must be of type int for selected attribute, string given
161-
ValueError: Error mode must be one of the PDO::ERRMODE_* constants
161+
ValueError: PDO::setAttribute(): Argument #2 ($value) Error mode must be one of the PDO::ERRMODE_* constants
162162

163163
Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: %d You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '%s' at line %d in %s on line %d
164164

ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ array(1) {
136136
[0]=>
137137
string(12) "PDOStatement"
138138
}
139-
PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
140-
PDO::ATTR_STATEMENT_CLASS class must be a valid class
141-
PDO::ATTR_STATEMENT_CLASS class must be a valid class
142-
PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement
143-
TypeError: User-supplied statement class cannot have a public constructor
139+
PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, string given
140+
PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS class must be a valid class
141+
PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS class must be a valid class
142+
PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement
143+
TypeError: PDO::setAttribute(): Argument #2 ($value) User-supplied statement class cannot have a public constructor
144144
array(2) {
145145
[0]=>
146146
string(12) "mystatement4"

0 commit comments

Comments
 (0)