PHP: <?php $link = mysqli_connect( 'localhost', 'root', '', 'kek_'); $content = mysqli_real_escape_string($link, $_POST['text']); $id = mysqli_query($link, "SELECT MAX(id) AS id FROM kek;"); $result = mysqli_query($link, "INSERT INTO kek (count, id, content) VALUES ('0', '$id+1', $count);"); ?> Что с этим делать? Ничего не добавляет в таблицу... Совсем!
Там ещё много чего нужно дописать. Несколько проверок. Потом получить данные, потому что mysqli_query вернёт ресурс, а нужно из него получить цифру. В документации есть примеры. --- Добавлено --- Переменная $content не используется нигде --- Добавлено --- $count не объявлена --- Добавлено --- $id+1 так не должно прибавлять, просто текст
PHP: <?php $link = mysqli_connect( 'localhost', 'root', '', 'kek_'); $content = mysqli_real_escape_string($link, $_POST['text']); $id_ = mysqli_query($link, "SELECT MAX(id) AS id FROM kek;"); $row = mysql_fetch_row($id_); $id = $row[0]; $result = mysqli_query($link, "INSERT INTO kek (count, id, content) VALUES ('0', id=$id+1, $content);"); ?> Сделал так , но все равно не работает! Что тут не так?
Вот почитай как включить отображение ошибок, по ним уже можно будет понять, что не так http://phpfaq.ru/debug
можно в скрипт добавить phpinfo(); и запустить, там уже искать display errors, должно быть yes --- Добавлено --- покажи последние изменения
@denis01 у меня так |display_errors|on|on c https://php.ru/forum/threads/ne-rabotaet-kod.59409/#post-479431 ничего не менялось кроме добавления ini_set('display_errors',1); error_reporting(E_ALL);
После 12 строчки можно сделать: PHP: echo "INSERT INTO kek (count, id, content) VALUES ('0', id=$id+1, $content);"; Результат в PHPMyAdmin и через него выполнить SQL запрос, чтобы посмотреть нет ли ошибок в нём. Ну и сюда выложи что echo покажет.
Зачем тебе это: $id+1 ? Да еще и дабл-запрос, когда можно это все в одном написать. И не проще ли сделать авто-инкремент? И вот еще что: Запрос не должен заканчиваться точкой с запятой. Данные в запросе должны быть корректно проэкранированы. А также должна быть правильно выставлена кодировка (коей у тебя нет), иначе ничего тебя не спасет и ты даже подозревать не будешь. Есть еще такой способ добавления: PHP: "INSERT INTO `kek` SET `count`='0', `content`='{$content}'"
@mahmuzar запрос заканчивается точкой с запятой в самом языке. Когда ты выполняешь query/exec и тому подобные аналоги различных клиентских библиотек - оно уже выполняет запрос. Если ты в своем запросе использует точку с запятой, то клиент разделит строку на Н+1 запросов где Н - число семиколонов. Ну то есть SELECT 1 FROM table; в консоле mysql выполняет 1 запрос, а в PHP - два.
Я так понимаю в mysqli поведение пофиксили. В мануале по mysql_query прям есть целое предложение на эту тему. В мануале по mysqli_query - уже нет.
@Ganzal, спасибо не знал. Выполняет один и тот же запрос два раза? или же ожидает что после ';' будет еще один запрос?
Выполняет пустой запрос, который завершается ошибкой. Я в свое время обратил внимание на огромные значения счетчиков запросов и фейлов в статистике СУБД и на странности в поведении своих кодов при обновлениях и выборках. Нашел про семиколон, убрал его везде, и всё стало работать стабильно и предсказуемо. Эх, молодость...
Скорее всего да, я использую PDO, потестил, не замечаю чтобы ошибки валились. У меня всегда стояли точки с запятой после запроса. Так получилось что я учить mysql начал с консольки, поэтому наверно вошло в привычку. И хотелось бы теперь точно знать, стоит ли мне это дело так оставлять, или же убрать везде точки с запятой?
Не совсем так. \g и ; это указание консольному клиенту начать выполнение последовательности байт слева как скуэль запроса. Клиентские библиотеки языков и так выполняют запрос с переданным текстовым аргументом или подготовленном на стороне сервера. Зачем в этом запросе выполнять команду выполнения запроса? Семиколон в джаваскрипте не является логическим нарушением. Он там не мешает, но ты при этом не теряешь скил в япах, где семиколон обязателен для разделения команд.
ага, после твоего поста прочитал про это. Я к тому что поведение PDO нормальное, раз так, значит как ты писал его пофиксили, поэтому спрашивается имеет ли смысл убирать везде ";".
Я тебе выше аргументировал за убрать её из запросов. Зачем она там тебе если она там не нужна? Сама функция уже и есть команда запуска выполнения запроса. Зачем тебе еще одна команда внутри самого запроса? Да, библиотека её скорее всего выпиливает перед трансляцией запроса на сервер, но вопрос-то не в том как оно под капотом работает, в а том что в голове у программиста что он внутри команды пишет команду. Пример из личного опыта: я вот очень люблю писать echo sprintf(...); "А что тебе мешает писать сразу printf?" спросил знакомый. А ведь и правда. Что... Ну как есть слова-паразиты, так есть и конструкции-паразиты видимо. Точка с запятой в тексте аргумента метода выполнения запроса к субд - одно из проявлений такого паразита. ТсЗ в ДЖ - не проявление, потому что практика для других япов. Как-то так.