Поэтому я пытаюсь вставить некоторые данные со страницы PHP в мою базу данных SQL. Эта страница доступна ТОЛЬКО через меня, так что я не беспокоюсь о том, что к ней обращаются или SQL-инъекции и т. Д. Моя проблема не имеет значения, какой код я использую, он не попадает в базу данных. Я сам пытался его кодировать, использовать коды шаблонов, брать с php.net и т.д., ничего не получалось!
Теперь он перенаправляет меня с сообщением об успехе, но все еще ничего в базе данных.
Код будет указан ниже, и я отредактирую некоторые из моих данных по соображениям конфиденциальности.
<?php
require connect.php
// If the values are posted, insert them into the database.
if (isset($_POST['username']) && isset($_POST['password'])){
$username = $_POST['username'];
$isadminB = $_POST['isadmin'];
$password = $_POST['password'];
$query = "INSERT INTO `users` (user_name, password, isadmin) VALUES ('$username', '$password', '$isadminB')";
$result = mysql_query($query);
if($result){
$msg = "User Created Successfully.";
}
}
$link = mysql_connect("localhost", "root", "password");
echo mysql_errno($link) . ": " . mysql_error($link). "\n";
echo mysql_errno($link) . ": " . mysql_error($link). "\n";
был код, который дал мне код ошибки 0?
Как и просили код для формы с моей предыдущей страницы.
<form action="account_create_submit.php" method="post">
Username: <input type="text" name="username" id="username"> <br /><br />
Password: <input type="password" name="password" id="password"> <br /><br />
<span id="isadmin">Is Admin: Yes<input type="radio" name="isadmin" id="1" value="1"> | No<input type="radio" name="isadmin" id="0" value="0"><br /></span>
<span id="submit"><input type="submit" value="Create Account"></span>
</form>
Итак, изменил код формы, поэтому метод теперь POST. Большой! Все данные читаются правильно, хотя это не было моей проблемой, поскольку даже ввод жестких данных для кода, который нужно отправить, не работал, по крайней мере, его будущая проблема уже решена. Новый код ошибки больше не 0, а следующий:
1064: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с » user_name ‘,’ password ‘,’ isadmin ‘) VALUES (‘ testZ ‘,’ lol ‘,’ 1 ‘)’ в строке 1
connect.php
<?php
$connection = mysql_connect('localhost', 'root', 'password');
if (!$connection){
die("Database Connection Failed" . mysql_error());
}
$select_db = mysql_select_db('Default_DB');
if (!$select_db){
die("Database Selection Failed" . mysql_error());
}
Во-первых, для тех из вас, кто получает неправильное представление о password
для имени столбца:
Конечно, это MySQL «ключевое слово», но не «зарезервированное» слово; более конкретно, это функция (см. ссылку). Обратите внимание, что нет (R)
рядом с «именем функции (ключевого слова)»: https://dev.mysql.com/doc/refman/5.5/en/keywords.html поэтому это совершенно верно в качестве имени столбца.
Ref: https://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password
Клещи требуются только в том случае, если они используются, чтобы не допустить их распознавания как «функции», что явно не в случае ОП. Таким образом, получить вашу информацию и факты прямо.
Более конкретно, если таблица называется PASSWORD
и без пробелов между именем таблицы и объявлением столбца:
т.е .: INSERT INTO PASSWORD(col_a, col_b, col_c) VALUES ('var_a', 'var_b', 'var_c')
что приведет к синтаксической ошибке, поскольку имя таблицы считается функцией.
Следовательно, правильный синтаксис должен читаться как
INSERT INTO `PASSWORD` (col_a, col_b, col_c) VALUES ('var_a', 'var_b', 'var_c')
(Изменить 🙂 Чтобы ответить на настоящий вопрос; вы используете $connection
в вашей связи, но с $link
наряду с отсутствующими переменными db, переданными вашему запросу, и кавычками / точкой с запятой, которые я уже обрисовал здесь.
Это если вы хотите, чтобы ваш код работал, но я очень не рекомендую. Вы используете устаревшую библиотеку MySQL и MD5, как вы заявили. Все старые технологии, которые больше не безопасны для использования и не будут поддерживаться в будущих версиях PHP.
Вы пропустили точку с запятой здесь require connect.php
и цитаты.
Это следует читать как require "connect.php";
Вы также должны удалить это:
$link = mysql_connect("localhost", "root", "password");
echo mysql_errno($link) . ": " . mysql_error($link). "\n";
вы уже пытаетесь включить файл подключения.
Используйте это в вашем файле подключения: (изменено, с использованием параметра подключения переменной подключения)
$connection = mysql_connect('localhost', 'root', 'password');
if (!$connection){
die("Database Connection Failed" . mysql_error());
}
$select_db = mysql_select_db('Default_DB', $connection);
if (!$select_db){
die("Database Selection Failed" . mysql_error());
}
и передать $connection
на ваш запрос в качестве 2-го параметра.
$result = mysql_query($query, $connection);
Добавьте сообщение об ошибке в начало файла (ов) сразу после открытия тега PHP
например <?php error_reporting(E_ALL); ini_set('display_errors', 1);
затем остальная часть вашего кода, чтобы увидеть, если он что-нибудь дает.
Также добавьте or die(mysql_error())
в mysql_query()
,
Если это по-прежнему вызывает у вас затруднения, вам необходимо скрыть свои данные.
т.е .:
$username = mysql_real_escape_string($_POST['username'], $connection);
и сделать то же самое для других.
Можно также сделать полную переписать и использовать mysqli_
с подготовленными заявлениями.
Заполните учетные данные для себя.
Sidenote: Возможно, вам придется заменить последний s
для i
для $isadminB
это если этот столбец int
,
$link = new mysqli('localhost', 'root', 'password', 'demo');
if ($link->connect_errno) {
throw new Exception($link->connect_error, $link->connect_errno);
}
if (!empty($_POST['username']) && !empty($_POST['password'])){
$username = $_POST['username'];
$isadminB = $_POST['isadmin'];
$password = $_POST['password'];
// now prepare an INSERT statement
if (!$stmt = $link->prepare('INSERT INTO `users`
(`user_name`, `password`, `isadmin`)
VALUES (?, ?, ?)')) {
throw new Exception($link->error, $link->errno);
}
// bind parameters
$stmt->bind_param('sss', $username, $password, $isadminB);
if (!$stmt->execute()) {
throw new Exception($stmt->error, $stmt->errno);
}
}
else{
echo "Nothing is set, or something is empty.";
}
Я заметил, что вы можете хранить пароли в виде простого текста. Если это так, это крайне обескураживает.
Я рекомендую вам использовать CRYPT_BLOWFISH или PHP 5.5 password_hash()
функция. Для PHP < 5.5 использовать password_hash() compatibility pack
.
Вы также можете использовать этот пример PDO, взятый из одного из ответов ircmaxell:
Просто используйте библиотеку. Шутки в сторону. Они существуют по причине.
password_hash()
password-compat
(пакет совместимости для выше)Не делай этого сам. Если вы создаете свою собственную соль, ТЫ ДЕЛАЕШЬ ЭТО НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
И при входе в систему:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
Вы используете «get» в качестве метода отправки формы. переменные post не будут распознаны.
Также…
Похоже, вам не хватает второго параметра вашей функции mysql_query (), который является идентификатором вашей ссылки на соединение MySQL. Я предполагаю, что вы создали соединение в connection.php.
Как правило, функция mysql_query () будет
$result = mysql_query($query, $conn);
с $ conn, предварительно заданным в вашем файле connection.php.
password
это специальное слово в MySQL, и может быть необходимо поместить слово в кавычки, такие как `password`
,
Почему вы помещаете всю информацию из формы в ссылку на отправить? например: account_create_submit.php?username=myusername&password=mypassword&isadmin=0
я могу увидеть это $username = $_POST['username'];
не соответствует имени пользователя в строке запроса.
$query = "INSERT INTO
пользователи(user_name, password, isadmin) VALUES ('$username', '$password', '$isadminB')";
Пока ты чинишь это, почему бы тебе не сделать $isadminB
а также $_POST['isadmin']
тот же самый. использование 'isadminB'
в обоих местах.
Проверьте это и посмотрите, что получится!