问题
I'm puzzled why the following code successfully adds a new row to my database table while mysqli_affected_rows($dbc)
returns "-1", thus an error, in signup.php:
dbc.inc.php :
DEFINE ('DB_USER', 'root');
DEFINE ('DB_PASSWORD', '');
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'v');
$dbc = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');
mysqli_set_charset($dbc, 'utf8');
signup.php :
require('dbc.inc.php');
//code to set variables for the following SQL statement
$q = "INSERT INTO users (username, email, pass, first_name, last_name, sex, birth_day, birth_month, birth_year, phone, street, street_nr, city, zip_code, country, user_img) VALUES ('$u', '$e', '$p', '$fn', '$ln', '$sex', '$bd', '$bm', '$by', '$pn', '$st', '$sn', '$cit', '$pc', '$ct', '$user_img')";
$r = mysqli_query($dbc, $q) or die(msg(0, "Error connecting to the database"));
if (mysqli_affected_rows($dbc) === 1) { //Returns 'false' despite one row having been added...
echo "Success";
}
else {
echo "Error"; //...resulting in "Error" being echoed
}
For testing purposes: SQL to create table "users":
CREATE TABLE IF NOT EXISTS `v`.`users` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`type` ENUM('member','admin') NOT NULL DEFAULT 'member',
`username` VARCHAR(45) NOT NULL,
`email` VARCHAR(80) NOT NULL,
`pass` VARCHAR(255) NOT NULL,
`first_name` VARCHAR(45) NOT NULL,
`last_name` VARCHAR(45) NOT NULL,
`sex` CHAR(1) NOT NULL,
`birth_day` INT NOT NULL,
`birth_month` INT NULL,
`birth_year` INT NULL,
`phone` VARCHAR(20) NULL,
`street` VARCHAR(60) NOT NULL,
`street_nr` VARCHAR(9) NOT NULL,
`city` VARCHAR(45) NOT NULL,
`zip_code` VARCHAR(45) NOT NULL,
`country` VARCHAR(45) NOT NULL,
`user_img` VARCHAR(65) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `username_UNIQUE` (`username` ASC),
UNIQUE INDEX `email_UNIQUE` (`email` ASC),
INDEX `login` (`email` ASC, `pass` ASC))
ENGINE = InnoDB
AUTO_INCREMENT = 4
DEFAULT CHARACTER SET = utf8;
I'd be very grateful for your hints!
EDIT:
I have meanwhile been able to isolate the problem a little further: the code works fine run directly in a web browser, it's just in Netbeans/Xdebug that mysqli_affected_rows($dbc)
in the according line first correctly returns "1", but after stepping into the following line (F7) suddenly changes to "-1" and thus wrongly jumps to the "else"-branch returning an error although the data is correctly written to the database. Apparently I'm not the only one having this problem.
These are my Xdebug Settings in php.ini, but I think they are correct.
zend_extension = "C:\xampp\php\ext\php_xdebug.dll"
;xdebug.profiler_append = 0
xdebug.profiler_enable = 1
;xdebug.profiler_enable_trigger = 0
;xdebug.profiler_output_dir = "C:\xampp\tmp"
;xdebug.profiler_output_name = "cachegrind.out.%t-%s"
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
;xdebug.trace_output_dir = "C:\xampp\tmp"
Any clues anybody?
回答1:
I have tested your code and it echos Success when new record inserted to database, please recheck your database to ensure data insertion
mysqli_affected_rows: return value
- An integer > 0 indicates the number of rows affected.
- 0 indicates that no records where affected &
-1 indicates that the query returned an error(that may be you case)
来源:https://stackoverflow.com/questions/23848434/netbeans-xdebug-mysqli-affected-rows-returns-1-when-it-should-be-1