Как сказал Теодор, никогда не используйте htmlentities()
для "экранирования" чего-то, что вы хотите поместить в свою БД.
Я настоятельно рекомендую использовать подготовленные операторы, когда что-либо (что может)исходящий извне (пользователь) хранится в базе данных.
Подготовленные операторы действительно просты в использовании.
Если вы используете PDO для доступа к вашей базе данных, справку можно найти здесь .Как вы можете видеть, метод bindParam()
используется для назначения любого значения заполнителю в запросе.
Если вы используете mysqli, вы можете найти документы здесь .Синтаксис bind_param()
немного отличается, поскольку заполнители не имеют имен (порядок имеет значение), а первый аргумент - это строка, определяющая тип аргументов («s» для строки, «i» для целого числа и т. Д.).
Использование подготовленных утверждений имеет несколько положительных эффектов.Прежде всего, он автоматически маскирует данные, предоставляемые методом bindParam()
/ bind_param()
, и является лучшим способом закрыть вектор атаки SQL и даже оптимизирует производительность ваших запросов, сохраняяплан выполнения в базе данных (это немного увеличивает накладные расходы, но если вы выполняете запрос дважды, он окупается вдвое).
PS: htmlentities()
следует использовать только в том случае, если вы хотите отобразить некоторый HTML в виде необработанного текстадля ваших пользователей (например, списки кодов).
PPS: не используйте real_escape_string()
для предотвращения внедрения SQL, поскольку это небезопасно ( supeskt.org )
Обновление
Прежде всего, для продолжения вы должны задать новый вопрос.Люди не читают вопросы, которые уже помечены как ответы, и открывая новые вопросы, вы даете добрым людям возможность получить вознаграждение.:)
Тем не менее, первый аргумент "sssd" сообщает поставщику базы данных, что вы передаете четыре аргумента, три типа string и четвертый типа double (в примере в документации три строки и одна двойнаясвязанный ("DEU", "Баварский", "F" и 11.2)).Здесь, очевидно, дело не в этом, вы фактически передаете (связываете) 21 значение.
В зависимости от типа столбцов в вашей таблице volunteers
вам необходимо передать строку из 21 символа в качестве первогоаргумент.Существует четыре возможных символа, которые можно использовать для определения типа:
- i для целых чисел
- d для двойных (числа с плавающей запятой)
- s для строки
- b для логического значения
Все, что вам нужно сделать, это проверить, какие типы столбцов БД имеются.Вы увидите, что типы в базе данных имеют разные имена (например, varchar, float и т. Д.).Если вы поищите в Google эти имена, вы обнаружите, что они похожи на строковые, целые, двойные и логические.Таким образом, вы должны выбрать наилучший тип соответствия в зависимости от типа столбца (строка ≆ varchar, double ≆ float, строка ≆ tinytext, строка ≆ date / datetime и т. Д.), И вы должны убедиться, что значения (ваши переменные $ _POST)на самом деле соответствует типу, который вы определили.
Предполагая, что все ваши столбцы имеют тип, подобный тексту типа varchar, первый аргумент будет выглядеть как 'sssssssssssssssssssss' (21 раз s) или 'ssssssssssssssissssss', если столбец, который принимаетволонтер_координатор имеет тип int (только для примера).
После того, как вы сделали это, вы должны дважды проверить, является ли f (mysqli_connect_errno())
ошибкой, связанной с копированием и вставкой, или вы действительно пропустили i
в своем коде (должно быть if (mysqli_connect_errno())
).
Если вы проверили, что вы должны написать $_POST['xyz']
вместо '$_POST[xyz]'
, это действительно поможет вам ('
отмечает начало / конец строкии xyz фактически является строкой здесь).
Если вы все еще сталкиваетесь с ошибками, включите более подробную информацию об ошибкахдобавив error_reporting(E_ALL);
вверху вашего файла (вы должны удалить его из соображений безопасности, когда ваш сайт запускается) и задать новый вопрос.
Обновление 2
ДелатьПроверьте строку подключения MySQL (аргументы, которые вы передаете в методе mysql()
). Вы уверены, что ваш пароль начинается с @ и заканчивается полной остановкой? Кстати, вы не должны публиковать пароли и т. Д. В общественных местах.
Убедитесь, что ваш сервер поддерживает методы mysqli, запустив скрипт, содержащий только
<?php
// Show all information, defaults to INFO_ALL
phpinfo();
?>
и проверьте вывод на что-то вроде этого: