SkinnerTeam
@SkinnerTeam
Разработчик интенет-портала "Skinner"

Что не так в этом коде?

<?php
  require("../system/perm.php");

$connect = mysqli_connect('localhost', 'ниважна, 'ниважна', 'ниважна') or die("800 ERROR");
mysqli_select_db('ниважна', $connect) or die("903 ERROR");
  
  mysql_query("CREATE TABLE IF NOT EXISTS test(
              user_name VARCHAR(100),
              age       TINYINT)              
              ") or die("MYSQL ERROR");
  
  $user_name = mysql_real_escape_string(@$_REQUEST['user_name'] or die("YOU BRAIN ERROR"));
  $age = mysql_real_escape_string(@$_REQUEST['age'] or die("ERROR IN THE YOU BRAIN"));
  mysql_query("
INSERT INTO `cp857169_main`.`test` (
`user_name` ,
`age`
)
VALUES (
'$user_name', '$age'
);")
?>

В итоге выводит 903 ERROR (ошибка на 9 строке кода). Как пофиксить? Уже все попробовал, то вообще ничего не выводит, то добавляет в таблицу цифры 1... Помогите, пожалуйста.
  • Вопрос задан
  • 179 просмотров
Решения вопроса 2
Ivanq
@Ivanq
Знаю php, js, html, css
1. mysql_query? Шел 2016 год.
2. mysqli_select_db($name, $link)? Пора почитать мануалы - сначала $connect, потом 'ниважна'
3. Опять же, $_REQUEST['age'] и $age? Я думал, register_globals по умолчанию off...
Я не ругаю, но просто иногда нужно сначала заглянуть на сайт.
Ответ написан
Хм.. что в этом коде "не так"? Короткий ответ: в этом коде всё не так.
Если по-длиннее, то:
1. Микс из mysqli_ и mysql_ функций - они друг к другу отношения не имеют и вместе не работают.
2. Не закрыта кавычка в mysqli_connect у второго аргумента.
3. Вы ходите в базу под пользователем root
4. В require используется относительный путь.
5. У mysqli_select_db перепутаны аргументы.
6. Не делаете mysqli_set_charset.
7. Закрыт PHP-тег ("?>")
8. Не понимаете как работает оператор "or"
9. Используете подавление ошибок.
10. Используете die вместо логирования и обработки ошибок.
11. die - хреновый способ обработки ошибок, но хоть какой-то. А вы его удаляете при выкладке в продакшн.
12. А что если в продакшене не получится подключиться к mysql, то как ваш код обработает и отреагирует на эту ситуацию?

А теперь подробнее об операторе "or". В отличии от Perl этот оператор возвращает не один из своих аргументов, а всегда возвращает либо true либо false.
Таким образом, выражение @$_REQUEST['user_name'] or die("YOU BRAIN ERROR") работает следующим образом: если @$_REQUEST['user_name'] содержит значение эквивалентное булевому значению истинности, то всё выражение вернёт true, иначе будет вычислен правый операнд: die(...), т.е. будет вызвана "функция" die и скрипт аварийно завершится.
Ключевой момент: оператор "or" не возвращает значение одного из своих операндов. Он всегда возвращает либо true, либо false.
Таким образом, если в запросе присутствует параметр "user_name", и он содержит значение эквивалентное булевому значению истинности, (т.е. непустое значение), то оператор "or" вернёт true. Далее, т.к. функция mysql_real_escape_string должна принять на вход строку, то возвращённое оператором значение true будет неявным образом приведено к строке. В результате приведения true к строке получится строка "1". Не число 1, а строка "1". Которая и будет скормлена в mysql_real_escape_string, который эту строку заэкранирует и в переменную $user_name ляжет значение "1".
То же самое происходит и с "age".

Надеюсь, я достаточно подробно разжевал.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для начала определитесь, что используете - mysql_ (не поддерживается начиная с PHP 7.0) или mysqli_. Ваш текущий микс работать не будет.
Не используйте @. Ошибки надо исправлять, а не подавлять информацию о них.
Не надо пытаться создать таблицу при каждом запросе, создавайте её заранее при развёртывании сайта.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы