Php/mysql: данные не вставляются в таблицу [дубликат]

avatar
buffyBTVS96
7 апреля 2018 в 23:04
65
2
-2

Итак, я пытаюсь создать эту форму, но не могу ввести данные в таблицу. Всякий раз, когда я нажимаю кнопку «Продолжить», на самом деле ничего не происходит. Я не получаю ошибку или что-то еще. и когда я проверяю свою базу данных, значения не были добавлены. Не знаю, как это происходит. Я часами пытался понять, в чем проблема, но я не могу ее определить, и дошло до того, что я почувствовал себя безнадежным и решил опубликовать этот вопрос, поэтому, пожалуйста, помогите мне. Вот мой код:

<?php

$conn = new mysqli("localhost", "root", "", "KFC");
if(isset($_POST['Submit_btn']))
{
    session_start();
    $RID= $_POST['R_ID'];
    $Name= $_POST['Name'];
    $S_Description=($_POST['S_Description']);
    $L_Description=($_POST['L_Description']);
    $Nutritional_value=($_POST['Nutritional_value']);
    $Cost=($_POST['Cost']);
    $TypeOfMeal=($_POST['TypeOfMeal']);
    $SubmittedBy=($_POST['SubmittedBy']);
    $sql= "INSERT INTO `recipe`(`R_ID`, `Name`, `S_Description`, `L_Description`, `Nutritional_value`, `Cost`, `TypeOfMeal`, `SubmittedBy`) VALUES ($RID,$Name,$S_Description,$L_Description,$Nutritional_value,$Cost,$TypeOfMeal,$SubmittedBy)";
    mysqli_query($conn,$sql);

}
mysqli_close($conn);
?>
<html>
<body>
<div id="bodyContent">
<h1> Registration </h1>
</div>
<form method="post">
<table>
<tr>
<td>R_ID: </td>
<td>
<input type="text" name="R_ID" class="textInput">
</td>
</tr>

<tr>
<td>Name: </td>
<td>
<input type="text" name="Name" class="textInput">
</td>
</tr>

<tr>
<td>Small Description: </td>
<td>
<input type="text" name="S_Description" class="textInput">
</td>
</tr>

<tr>
<td>Long Description: </td>
<td>
<input type="text" name="L_Description" class="textInput">
</td>
</tr>

<tr>
<td>Nutritional value: </td>
<td>
<input type="text" name="Nutritional_value" class="textInput">
</td>
</tr>

<tr>
<td>Cost: </td>
<td>
<input type="number" name="Cost" class="textInput">
</td>
</tr>

<tr>
<td>Type Of Meal: </td>
<td>
<input type="text" name="TypeOfMeal" class="textInput">
</td>
</tr>

<tr>
<td>UserID: </td>
<td>
<input type="Number" name="SubmittedBy" class="textInput">
</td>
</tr>

<tr>
<td> </td>
<td>
<input type="submit" name="Submit_btn" value="Continue">
</td>
</tr>

</table>
</form>
</body>
</html>
Источник
Spoody
7 апреля 2018 в 23:07
2

Ваш код уязвим для SQL-инъекций и будет взломан, даже если вы экранируете ввод! Вместо этого используйте Подготовленные отчеты.

rickdenhaan
7 апреля 2018 в 23:08
2

«Я не получаю ошибку или что-то в этом роде» — вы не проверяете ошибку. Если запрос не выполнен, mysqli_query() вернет false, и вы можете получить дополнительную информацию о почему не удалось выполнить, просмотрев результат mysqli_error().

Spoody
7 апреля 2018 в 23:09
1

Кроме того, почему вы добавляете круглые скобки вокруг переменных $_POST?

Raymond Nijland
7 апреля 2018 в 23:09
1

«Я не получаю сообщение об ошибке или что-то в этом роде», я не вижу, чтобы в вашем коде была включена функция error_reporting.

Funk Forty Niner
8 апреля 2018 в 00:29
1

у вас есть привычка получать решения и убегать?

buffyBTVS96
8 апреля 2018 в 01:26
0

@FunkFortyNiner На все вопросы, которые я разместил, включая этот, я не получил ответа, который решил бы мою проблему. Я не хочу использовать людей, используя их решения, а затем убегая. Не думайте обо мне идиотских вещей, не зная, о чем вы говорите. Спасибо.

Ответы (2)

avatar
Paul G Mihai
7 апреля 2018 в 23:15
0

Хорошо, несколько вещей:

$SubmittedBy=($_POST['SubmittedBy']);

круглые скобки вокруг $_POST не нужны. Но если вы собираетесь использовать данные из него, особенно в SQL, но не только, вы должны дезинфицировать ввод. Вот пример с mysqli_real_escape_string, так что это будет выглядеть так:

$SubmittedBy=mysqli_real_escape_string($conn, $_POST['SubmittedBy']);

Существуют и другие методы, такие как PDO::quote или использование подготовленных операторов, возможно, вы захотите взглянуть и на них.

Далее ваш sql вставляет значения без кавычек:

$sql= "INSERT INTO `recipe`(`R_ID`, `Name`, `S_Description`, `L_Description`, `Nutritional_value`, `Cost`, `TypeOfMeal`, `SubmittedBy`) VALUES ('$RID','$Name','$S_Description','$L_Description','$Nutritional_value','$Cost','$TypeOfMeal','$SubmittedBy')";

Отредактировано: Спасибо Funk Forty Niner за то, что он указал на недостающий $conn !

buffyBTVS96
7 апреля 2018 в 23:22
0

поэтому я использовал mysqli_error(), и он показал мне следующее сообщение: - Неизвестный столбец «sid» в «списке полей». Я не понимаю, на что он ссылается. Я не использовал столбец sid.. Даже не имею его

Spoody
7 апреля 2018 в 23:29
1

mysqli_real_escape_string не защищает от SQL-инъекций

Paul G Mihai
7 апреля 2018 в 23:48
0

@MehdiBounya, пожалуйста, покажи мне, как ты можешь взломать мой sql, учитывая, что я использовал одинарные кавычки вместе с mysqli_real_escape_string

Funk Forty Niner
7 апреля 2018 в 23:49
1

на самом деле @Paul функция escape даже не запустится; отсутствует аргумент соединения. Итак, вы были правы только на 1/2.

Paul G Mihai
7 апреля 2018 в 23:51
0

@Chris злоупотребляет подготовленными операторами, поскольку дезинфицирующие средства sql создают ненужные накладные расходы. Их следует использовать только в том случае, если sql используется повторно и изменяются только параметры! Если вы используете его один раз, вы создаете ненужную связь с сервером mysql и кэшем sql, которая никогда не будет использоваться во второй раз.

Funk Forty Niner
7 апреля 2018 в 23:58
2

Я со всеми здесь об использовании подготовленного заявления. Есть гораздо больше преимуществ, чем просто помощь в предотвращении sql-инъекций. С PDO, например; именованные заполнители намного легче отслеживать.

Paul G Mihai
8 апреля 2018 в 00:17
0

@Chris Это злоупотребление тем, что подготовленные операторы создаются не для целей очистки, а для многократного использования, поэтому для избавления парсера SQL и соединения от обработки и передачи одного и того же материала снова и снова. Накладные расходы могут быть небольшими, но они быстро накапливаются, когда вы выполняете множество уникальных запросов.

Paul G Mihai
8 апреля 2018 в 00:35
0

@FunkFortyNiner Я согласен, что привязка именованного параметра хороша, но лучше, чем иметь кучу «???». Я не против использования подготовленных операторов... вообще, они, безусловно, являются более надежным решением. Если бы был способ избежать 2 взаимодействий с сервером и накладных расходов на кеш, я бы всегда использовал его, без вопросов. Однако сейчас я использую их осторожно.

Funk Forty Niner
8 апреля 2018 в 00:38
0

Согласен, @Paul, и да, это то, что я имел в виду ранее, когда терялся в куче ? и iisssssiiisssissssissssssdssssbssssii, , ха-ха!<96702444462792> ;-) хорошо, может быть, я немного переборщил ¯_(ツ)_/¯

avatar
ankabot
7 апреля 2018 в 23:15
-1

Попробуйте заменить на это

<?php
// This prevents SQL injection threat
$RID = mysqli_real_escape_string($conn, $RID);
$Name = mysqli_real_escape_string($conn, $Name);
$S_Description = mysqli_real_escape_string($conn, $S_Description);
$L_Description = mysqli_real_escape_string($conn, $L_Description);
$Nutritional_value = mysqli_real_escape_string($conn, $Nutritional_value);
$Cost = mysqli_real_escape_string($conn, $Cost);
$TypeOfMeal = mysqli_real_escape_string($conn, $TypeOfMeal);
$SubmittedBy = mysqli_real_escape_string($conn, $SubmittedBy);

$sql= "INSERT INTO `recipe`(`R_ID`, `Name`, `S_Description`, `L_Description`, `Nutritional_value`, `Cost`, `TypeOfMeal`, `SubmittedBy`) VALUES ('$RID','$Name','$S_Description','$L_Description','$Nutritional_value','$Cost','$TypeOfMeal','$SubmittedBy')";

Но что более важно, активируйте отображение ошибок в вашей среде DEV, но удалите его, когда вы будете размещать свой веб-сайт (среда PROD):

<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
Chris
7 апреля 2018 в 23:30
2

Пожалуйста, порекомендуйте привязку параметров, а не произвольное использование mysqli_real_escape_string(). Не зная типов этих столбцов, невозможно узнать, будет ли эта функция работать правильно.

ankabot
7 апреля 2018 в 23:33
0

Ну, это всегда должно работать, даже если тип является числом, поскольку мы находимся в Mysql, используя NUMBER = 1 или NUMBER = '1' то же самое... Покажите мне случай, когда это не сработает, мне любопытно.

Chris
7 апреля 2018 в 23:34
0

См. coderhelper.com/a/5741264/354577. единственный способ надежно защититься от SQL-инъекций — использовать привязку параметров.

Chris
7 апреля 2018 в 23:35
0

И, кстати, эти два утверждения не совпадают ни в одной здравомыслящей базе данных. MySQL не в здравом уме; это не должно делать принуждение типа.

Raymond Nijland
7 апреля 2018 в 23:35
0

"в Mysql использование NUMBER = 1 или NUMBER = '1' - то же самое... Покажите мне случай, когда это не сработает, мне любопытно" Хорошо, вы просили об этом. Если NUMBER имеет тип данных int и индексируется, и если вы используете WHERE NUMBER = '1', MySQL не может использовать индекс для столбца NUMBER.

ankabot
7 апреля 2018 в 23:36
0

Я заключил переменные в одинарные кавычки, поэтому то, что вы показали, не применяется к моему коду...

Chris
7 апреля 2018 в 23:40
0

Я не собираюсь больше тратить время на споры с вами об этом. Но вам следует проверить sqlmap.org. Существует гораздо больше способов внедрения SQL, чем вы себе представляете<66160777895745>, и ваше решение не защищает от всех из них, и точка.

ankabot
7 апреля 2018 в 23:42
0

@Raymond Nijland Хорошо, хорошо, но индексируем ли мы типы столбцов INT? Они должны быть быстрыми для поиска, в любом случае, не знаю, но в любом случае PDO является рекомендуемым решением для работы с базами данных в PHP, но здесь я следую коду пользователя, и поскольку mysqli все еще используется с PHP 7, мы все еще можем используйте его, мы все начинали с mysql_connect().

Raymond Nijland
7 апреля 2018 в 23:42
0

Кроме того, mysqli_real_escape_string является «безопасным» только тогда, когда вы устанавливаете кодировку клиента, как сказано в документации. «Безопасность: набор символов по умолчанию. Набор символов должен быть установлен либо на уровне сервера, либо с помощью функции API mysqli_set_charset(), чтобы он повлиял на mysqli_real_escape_string()».

Chris
7 апреля 2018 в 23:47
0

Я знаю, что сказал, что не собираюсь больше тратить здесь время, но вот еще один хороший ресурс: phpdelusions.net/sql_injection

ankabot
8 апреля 2018 в 00:14
0

@RaymondNijland Ваша точка зрения верна, как я могу изменить код, чтобы учесть ваше примечание?