Arhn - архитектура программирования

MYSQLI/PHP: num_rows ничего не возвращает/null

Я прочитал много тем с одной и той же проблемой, но ни одна из них не решила мою проблему.
У меня есть следующий код:

$connection = mysqli_connect('...');
if(mysqli_connect_errno()) {
    die('Connect Error');
}
$connection->set_charset("utf8");
$success = $connection->query("INSERT INTO hilde_entrys (Comment, Refer_ID, Account_Adress) VALUES ('".$_POST["comment"]."','".$GET["id"]."','".$userData["user_address"]."')");
$success->store_result(); //I did this as it helped some people - it didn´t help me :(
$rows = $success->num_rows;
while($row = $success->fetch_row()) { //This whole while-loop helped some other guy on stackoverflow - not me
    $rows = $success->num_rows; //Incrementing by 1 each time
} 
$rows = $success->num_rows; // Finally the total count 

if ($rows > 0) { //What I actually intended to do with the num_rows...
    $success->free();
    $success->close();
    $connection->close();
} else {
    $success->free();
    $success->close();
    $connection->close();
    die("Query failed.");
}

Каким-то образом, хотя я перепробовал все возможное, он просто не вернул ничего ожидаемого. (Да, запрос и все остальное работает. Пробовал.). Что не так?
Заранее спасибо за ответы,
VicStudio

О, кстати: даже когда я удаляю $success->free();, это ничего не меняет с num_rows....

EDIT: после того, как вы, ребята, сказали мне, что INSERT не вернет никаких строк, как я могу проверить, успешно ли выполнен запрос?

ЕЩЕ ОДНА ПРАВКА: во-первых, кто-то сказал мне использовать затронутые_строки вместо num_rows, что я сейчас понимаю. Почему-то это все еще не работало, поэтому один из вас попросил меня активировать отчеты об ошибках в моем php-скрипте, и теперь я получил следующие два сообщения об ошибках (одно уведомление и одно фатальная ошибка):
Примечание: попытка получить свойство не-объекта в (моей веб-странице) в строке XX
Неустранимая ошибка: вызов функции-члена close() для не-объекта in (моя веб-страница) в строке XX
Уведомление относится к строке $rows = $success->affected_rows; (я заменил $rows = $success->num_rows на это). (Я прокомментировал цикл while).
Вторая ошибка, из-за которой экран становится пустым, относится к $success->close();, той, что в предложении else. Это означает,
а) он не обнаруживает, ЧТО что-то было изменено, и
б) что у него проблема с закрытием запроса.
Может ли кто-нибудь объяснить мне, почему? Я проверил свою базу данных, и INSERT-запрос удался, поэтому он должен был попасть в if, а не в else. И почему он не хочет, чтобы я закрывал запрос? Я предполагаю, что обе эти ошибки имеют какое-то отношение друг к другу. Заранее спасибо, ребята. Извините за долгое время между моим новым постом, но требуется время, чтобы разобраться в вещах и особенно записать их.


  • INSERT не создаст никаких строк для извлечения. !!!!!!! 13.07.2017
  • Вы должны прочитать о SQL-инъекциях... 13.07.2017
  • Цитата: num_rows — возвращает количество строк в наборе результатов. Вы не получили набор результатов. 13.07.2017
  • @jeroen, я знаю, что это довольно небезопасно, но (до сих пор) это всего лишь нестабильная версия для разработчиков. Поэтому я добавлю часть безопасности позже. 13.07.2017
  • @RiggsFolly Это логично, но почему бы мне его не получить? Я только что сделал запрос и хочу проверить, удалось ли это... 13.07.2017
  • Речь идет не только о безопасности, но и о действительном sql, и кавычки в данных сломают ваши. И безопасность никогда не должна приходить позже. 13.07.2017
  • Погрузитесь в Руководство Давай, в воде прекрасно 13.07.2017
  • @jeroen Вау, хорошо! Как заставить котировки работать? 13.07.2017
  • Кроме того, если запрос INSERT не удался, $success будет FALSE 13.07.2017
  • Вы должны прочитать о SQL-инъекциях... 13.07.2017
  • @jeroen Вы можете привести лошадь к воде, но вы не можете заставить ее думать 13.07.2017
  • @jeroen Отредактировал мой пост. Прочтите это. 13.07.2017
  • Я прочитал это и дал ответ, так как это было немного длинно для комментария 13.07.2017

Ответы:


1

Поскольку mysqli_query(), выполняющий запрос INSERT, возвращает только TRUE или FALSE, ваш $success никогда не будет объектом mysqli_result, как это было бы в запросе SELECT.

Поэтому ваш тест для affected_rows должен использовать такой объект подключения. На самом деле свойство affected_rows существует только в объекте mysqli_object.

$connection->affected_rows;

So

$connection = mysqli_connect('...');
if(mysqli_connect_errno()) {
    die('Connect Error');
}
$connection->set_charset("utf8");
$success = $connection->query("AN INSERT QUERY");

$rows = $connection->affected_rows;

Я признаю, что руководство по PHP не очень хорошо в этой области, но оно утверждает это

Это также объясняет, почему

$success->free();
$success->close();

не работает, так как $success не является объектом.

А также почему

$success->store_result();

не работает. $success не является объектом, и нет результатов для сохранения.

13.07.2017
  • Вы решили проблему a)/notice, но все еще есть фатальная ошибка, говорящая о том, что close() пытается вызвать не-объект в строке 16 фрагмента кода (теперь он принимает правильное предложение, но все еще, кажется, имеет проблема с вызовом close()...) 13.07.2017
  • Прочитайте весь ответ, может потребоваться обновление страницы 13.07.2017
  • РЕДАКТИРОВАТЬ: Теперь, когда я увидел ваше новое редактирование, я просто попробовал еще раз и... ЭТО РАБОТАЕТ! Большое спасибо за вашу помощь! Также спасибо Драгину, который приблизил меня к цели, и Джероену, который показал мне, что безопасность на самом деле важна. 13.07.2017

  • 2

    Для вставки вы должны использовать затронутые_строки $rows = $success->affected_rows; PHP затронутые_строки

    Прочитайте о num_rows здесь PHP num_rows

    13.07.2017
  • Добавьте ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); в начало вашего скрипта. Это заставит любые ошибки mysqli_ генерировать исключение, которое вы видите в браузере, и другие ошибки также будут видны в вашем браузере. 13.07.2017
  • На данный момент не могу проверить, может ли это быть так, но вы пытались удалить $success->store_result()? 13.07.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..