Я хочу вставить значение выбранной «формы выбора» в мою базу данных mysql.
Как я могу получить правильное значение этого?
<form action='' method='post'> <select name="myselectbox"> <option name="myoption1" value="myoption1">myoption1</option> <option name="myoption2" value="myoption2">myoption2</option> <option name="myoption3" value="myoption3">myoption3</option> <option name="myoption4" value="myoption4">myoption4</option> </select> <input type='submit' value='submit'/> </form>
что-то вроде того? (этот не работал явно ..)
$sql = "INSERT INTO Entries (myoption1) VALUES ('$_POST[myselectbox]')";
вы должны перенести свой тег select в тег формы.
<form action='' method='post'> <select name="myselectbox"> <option name="myoption1" value="myoption1">myoption1</option> <option name="myoption2" value="myoption2">myoption2</option> <option name="myoption3" value="myoption3">myoption3</option> <option name="myoption4" value="myoption4">myoption4</option> </select> <input type='submit' value='submit'/> </form>
после отправки формы вы получите переменную post как $_POST['myselectbox']
которая может быть добавлена в запрос mysql, как вы уже это делали. но для лучшего способа просто не добавляйте его так, как нужно, но проверьте, что форма отправлена, а пост-переменные доступны или нет до добавления. например:
if(!empty($_POST['myselectbox'])){ /*.. do your query section... */ }
у вас есть ошибка в вашей команде SQL, $_POST
требует, чтобы имена html были обернуты в кавычки вроде => $_POST['some_name']
:
$sql = "INSERT INTO Entries (myoption1) VALUES ('$_POST[myselectbox]')"; /* ^^ missing quotes here*/
попробуйте так:
$sql = "INSERT INTO Entries (myoption1) VALUES (".$_POST['myselectbox'].")";
Предполагая, что ваша форма верна, и она отправляет значения, которые вы хотите использовать для своего сценария.
(Вы посыпали свой код echo
чтобы убедиться, что это так?)
Самый простой надежный способ отправки данных в SQL-оператор и, следовательно, в mysql – использовать подготовленные операторы.
Взгляните сюда: http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
В основном вы пишете инструкцию SQL без ваших переменных в ней (заменены на ?
), А затем передаете mysql для выполнения операторов с вашими переменными позже. Это позволяет избежать необходимости избегать строк и беспокоиться о том, как строить вещи.
Например, у вас может быть:
// Connect to mysql $mysqli = new mysqli('where your server is', 'my_user', 'my_password', 'world'); // Build the initial statement - easier to read as you don't have your string concatenation here $stmt = $mysqli->prepare( "INSERT INTO Entries (myoption1) VALUES (?)" ); // Tell mysql that the '?' should be replaced with the value in your post array $stmt->bind_param( "s", $POST['myselectbox'] ); // Execute the statement $stmt->execute()
Очевидно, вы также должны добавить обработку ошибок, но документация охватывает основы этого.
SQL-инъекция
Основная причина, по которой использование подготовленных операторов является хорошей идеей, заключается в том, что она позволяет избежать атак SQL-инъекций.
Есть и другие способы, но, на мой взгляд, это самое простое решение.
Атаки SQL Injection – это ситуации, когда кто-то пытается изменить оператор SQL, который запускается путем «ввода» другого SQL в ваш оператор.
Используя ваш код в качестве примера, вы можете выполнить это заявление:
$sql = "INSERT INTO Entries (myoption1) VALUES ('". $_POST['myselectbox'] ."')";
Который обычно получал бы (предположим) что-то вроде myoption1
.
Это приведет к тому, что SQL будет:
INSERT INTO Entries (myoption1) VALUES ('myoption1');
Если кто-то решил, они могли бы отправить '='' OR '1'='1
Это приведет к тому, что SQL будет:
INSERT INTO Entries (myoption1) VALUES (''='' OR '1'='1');
Что (очевидно) очень отличается.
Или, что еще хуже, отправьте '=')'; DROP TABLE Entries WHERE (''='
'=')'; DROP TABLE Entries WHERE (''='
Это приведет к тому, что SQL будет:
INSERT INTO Entries (myoption1) VALUES (''=''); DROP TABLE Entries WHERE (''='');
Использовать подготовленные заявления
Проще говоря, но используя подготовленные инструкции, вы сообщаете mysql, что отправляемая вами буква – это строка, которая будет использоваться в качестве параметра. Его никогда нельзя рассматривать как часть самого утверждения, и поэтому вышеизложенное просто невозможно.
Гораздо безопаснее.
Надеюсь, это станет более ясным. Если вы хотите получить дополнительную информацию, я предлагаю вам изучить ее самостоятельно …
$value = mysql_real_escape_string($_POST['myselectbox']); $sql = "INSERT INTO Entries (myoption1) VALUES ($value)";