У меня есть страница с кодом php, берут новую строку пароля пользователя для изменения пароля пользователя и после некоторого кода проверки отправляем на страницу процесса для записи обновления в таблице пользователей. после отправки новой строки пароля на страницу процесса и выполнения запроса на обновление mysqli_affered_rows возвращает -1, но запрос на обновление был успешным и пароль был изменен или если предыдущая строка пароля была тем же, что и предыдущий пароль, запрос на обновление не вносит никаких изменений, но по-прежнему возвращает -1 ,
Я использую функции mysqli во всех моих кодах.
db_conncet_fnc (), db_query_func (), db_fetch_assoc_func (), … Эти функции включают в себя те же функции mysqli.
мой код страницы процесса такой:
$link_con=db_conncet_fnc();
require_once("PassHash.php");
$query = "SELECT * FROM mdr WHERE m_id='$md_id'";
$result = db_query_func($query);
$affecteds= mysqli_affected_rows($link_con);
$_SESSION["affecteds"]=$affecteds; //this is for test before UPDATE query
$_SESSION["affected-s-oop"]=$link_con->affected_rows; //this is for test before UPDATE query
$rec = db_fetch_assoc_func($result);
$p_hasher = new PassHsh(25, FALSE);
$ans = "2"; //answer without error is 2
if($rec)
{
if ($pass != "" && $newpsw != "" && $check = $p_hasher->checkpss($newpsw, $rec["userpass"])) {
if ($chngpsw_err < 2) {
$_SESSION["chngpsw_err"] = "has";
}
$_SESSION["pass_nwpass_is_equal"] = "yes";
header("location:index.php?page=chngpass");
exit();
} elseif ($check = $p_hasher->checkpss($pass, $rec["userpass"])) {
$hashed_psw = $p_hasher->HashPassword($newpsw);
$query = "UPDATE `mdr` SET `userpass`='$hashed_psw' WHERE m_id='" . $md_id . "' ";
$result = db_query_func($query);
$affect_upd = mysqli_affected_rows($link_con);
$_SESSION["affect_upd"] = $affect_upd; //by function
$_SESSION["affect_upd-oop"] = $link_con->affected_rows; //by object
if ($affect_upd == 0) {
$_SESSION["update_result"] = "err0";
header("location: index.php?page=chngpass");
exit();
}
if ($affect_upd == -1) {
$_SESSION["update_result"] = "err-1";
header("location: index.php?page=chngpass");
exit();
}
if ($affect_upd > 0) {
$_SESSION["update_result"] = "ok";
header("location: index.php?page=chngpass");
exit();
}
} else {
$ans = "1";
header("location: index.php?page=chngpass&ans=$ans");
}
}
Я нашел некоторые вопросы по этому поводу в stackoverflow и Google и обсудил ошибку в MySQL с Xdebug как это https://bugs.php.net/bug.php?id=67348 но я не использую $ connect-> stat, и некоторые страницы писали об ошибке в mysqli для каждого, где включен xdebug, поэтому я отключаю xdebug в php.ini, но mysqli_affered_rows возвращает -1 во всех состояниях и событиях, а также во всех позициях.
Я использовал Google Chrome для отладки с помощью phpstorme раньше.
Должен ли я что-то отключить в Chrome?
После нескольких дней поиска на различных сайтах Google и поиска в stackoverflow и выполнения написанных шагов и предложений я не смог решить эту проблему.
Человек по имени «сиддхарадж соланки» написал в этом вопросе:
mysqli_acted_rows создает новое соединение (подробнее читайте)
писал:
Теперь проблема в том, что я не понимаю, как передать ссылку на базу данных.
($ link) в функции mysqli_affered_rows (). Я пробовал выше, но это
создается впечатление, что создается новое соединение с базой данных, поэтому mysqli_affered_rows
возвращает 0 вместо 1.
Так что я думаю, что ошибка не будет легко решена для этой функции на основе моих исследований и этой ссылки:
https://www.google.com/search?q=bug+mysqli_affected_rows
пожалуйста, сообщите мне, что решение или что является хорошим или лучшим способом вместо mysqli_affered_rows для проверки запроса на обновление?
хорошее время
Пожалуйста, помогите мне решить это.
Благодарю.
Приведенные выше комментарии действительно объясняют, что не так, но я суммирую здесь и отмечу этот ответ сообщества вики.
Ваш код создает соединение с базой данных, но вы сказали, что ваш db_query_func()
Функция создает отдельное соединение с базой данных для запуска запроса.
Количество затронутых строк может сообщать только о строках, затронутых запросом в том же соединении. Но вы выполнили ОБНОВЛЕНИЕ в другом соединении.
Рассмотрим эту аналогию: вы открываете два отдельных ssh
сеансы на удаленный сервер. Вы запускаете команду в одной оболочке, а затем в Другой оболочка, которую вы используете !!
повторить команду. Вторая оболочка не имеет представления об истории команд из первой оболочки, поэтому она не может повторить ту же команду.
Вам нужно использовать то же соединение с базой данных, чтобы выполнить запрос, а затем сообщить о затронутых строках. Возможно, приведенные выше комментарии не прояснили это, но вы можете решить эту проблему, передав соединение в функцию запроса:
$result = db_query_func($link_con, $query);
Внутри этой функции не создавайте новое соединение MySQL, но используйте соединение, которое вы передали в качестве аргумента.
Затем, когда он возвращается, он имеет соответствующий контекст, чтобы вы могли получить mysqli_affected_rows($link_con)
из того же соединения.
Возможны и другие альтернативные решения:
Непонятно зачем тебе db_query_func()
совсем. Возможно, вам следует просто позвонить mysqli_query()
из вашего основного кода.
Или еще db_query_func()
должен позвонить mysqli_affected_rows()
сам и вернуть значение.
Других решений пока нет …