Вставка значений в SQL с помощью PHP

<?php
if (isset($_POST['submit'])) {
    //google ReCAPTCHA
    $secret = "-";
    $response = $_POST['g-recaptcha-response'];
    $remoteip = $_SERVER['REMOTE_ADDR'];
    $url = "https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}&remoteip={$remoteip}";
    $response = file_get_contents($url);
    $result = json_decode($response);

    if ($result->success) {
        define("SERVERNAME", "-");
        define("USERNAME", "-");
        define("PASSWORD", "-");
        define("DATABASE", "-");


        $connection = mysqli_connect(SERVERNAME, USERNAME, PASSWORD, DATABASE);
        if (!($connection->connect_error)) {
            $sql = "INSERT INTO `gift` (`t`, `p`, `a`, `c`, `ph`, `e`) VALUES ('{$_POST['t']}', '{$_POST['p']}', '{$_POST['a']}', '{$_POST['c']}', '{$_POST['ph']}', '{$_POST['e']}')";
            $result = $connection->query($sql);
            if ($result) {
                echo '<script>alert("OK.");</script>';
            } else {
                echo '<script>alert("ERROR1.");</script>';
            }
        } else {
            echo '<script>alert("ERROR2.");</script>';
        }
    } else {
        echo '<script>alert("Verification failed.");</script>';
    }
}
?>

Я не знаю, почему это не работает. Я попытался использовать var_dump($sql), и он возвращает мне правильную строку. После этого я не могу выполнить var_dump($result), потому что он ничего не возвращает. Я потерялся. Я пытался что-то с этим сделать весь день, может быть, поэтому я не вижу, что здесь не так.

Моя основная цель - вставить некоторую информацию в базу данных.


person szpanel    schedule 18.07.2018    source источник
comment
См. php.net/manual/en/mysqli.error.php и прочтите на внедрение SQL и как связать параметры.   -  person ficuscr    schedule 19.07.2018
comment
Я не одобряю названия ваших столбцов. И у меня не хватает бровей, чтобы осуждать твою SQL-инъекцию.   -  person Xorifelse    schedule 19.07.2018
comment
Xorifelse Я изменил имена столбцов, потому что не хотел их здесь показывать. Если бы вы писали об этом.   -  person szpanel    schedule 19.07.2018
comment
Это был незначительный хмурый взгляд. Понятно, если вы оставите свой скрипт открытым таким образом, и совершенно необязательно, если вы будете использовать подготовленные операторы.   -  person Xorifelse    schedule 19.07.2018
comment
Ваш скрипт широко открыт для атаки SQL-инъекций даже если вы экранируете входные данные, это небезопасно! Используйте < href="http://php.net/manual/en/mysqli.quickstart.prepared-statements.php" rel="nofollow noreferrer">подготовленные параметризованные операторы в MYSQLI_ или PDO API   -  person RiggsFolly    schedule 19.07.2018
comment
Да, я слышал об атаке с помощью SQL-инъекций, но мне нужна эта база данных, может быть, на 1 месяц и для небольшого сообщества, которое я знаю, но вы правы, мне нужно узнать об этом. Так что лучшие варианты будут, если я узнаю о готовых параметризованных статах и ​​потом попробую что-то сделать?   -  person szpanel    schedule 19.07.2018
comment
@szpanel Хорошо, если ты хочешь учиться. Убедитесь, что столбец ID является автоматически инкрементным первичным ключом, и измените SQL на: INSERT INTO `gift` (`t` и удалите вставку NULL. Возможна ошибка SQL для повторяющейся записи. Также вполне может быть, что значения содержат " или ', что приведет к сбою SQL. Решите, используя подготовленные операторы.   -  person Xorifelse    schedule 19.07.2018
comment
@Xorifelse Да, конечно, я хочу этому научиться. Я смоделировал его на w3schools, и у них есть такая вставка. (извините за мой английский, я знаю...). Я уверен, что ID автоматически инкрементный. измените SQL на: INSERT INTO gift (t - Где разница? Хорошо, я удалю.   -  person szpanel    schedule 19.07.2018
comment
@szpanel Вы не вставляете идентификатор, это делается автоматически. Просто пропустите col и значение в операторе sql.   -  person Xorifelse    schedule 19.07.2018
comment
Я менял, но не помогло :(.   -  person szpanel    schedule 19.07.2018
comment
@Xorifelse Использование NULL в качестве значения является приемлемым способом автоматического увеличения.   -  person Barmar    schedule 19.07.2018
comment
@Barmar Я скопировал его из phpmyadmin и просто отредактировал некоторые значения.   -  person szpanel    schedule 19.07.2018
comment
@szpanel Я не уверен, какое это имеет отношение к моему комментарию. Ваш исходный код был в порядке.   -  person Barmar    schedule 19.07.2018
comment
Если вы получаете ответ FALSE из запроса, вы должны напечатать $connection->error, чтобы увидеть причину.   -  person Barmar    schedule 19.07.2018
comment
просто поместите эхо $sql после его создания. Поместите эту строку в adminder или phpmyadmin. После этого вы точно знаете, что происходит в базе данных :-) для изучения php :-)   -  person User__42    schedule 19.07.2018
comment
@Barmar Я просто хотел объяснить, почему было id и значение NULL.   -  person szpanel    schedule 19.07.2018
comment
И я просто объяснял, почему это нормально, а изменение, которое Ксорифельс сказал тебе сделать, было ненужным.   -  person Barmar    schedule 19.07.2018
comment
echo $sql возвращает правильную строку, которую я хочу, и, как я уже сказал, если я хочу повторить результат $, ничего не происходит.   -  person szpanel    schedule 19.07.2018
comment
@Barmar Возможно, сейчас это приемлемо, но оно все еще полностью устарело. У меня когда-то была эта проблема раньше, с MySQL 5.1. Это была ошибка, которую можно было избежать, не написав дополнительный код. Я узнал.   -  person Xorifelse    schedule 19.07.2018
comment
@szpanel Что выводит код?   -  person Xorifelse    schedule 19.07.2018
comment
ВСТАВЬТЕ В gift (t, p, a, c, ph, e) ЗНАЧЕНИЯ ('test', 'test', 'test', 'test', 'test', '[email protected]')   -  person szpanel    schedule 19.07.2018
comment
@szpanel В соответствии с приведенным выше кодом. Это не ожидаемый результат.   -  person Xorifelse    schedule 19.07.2018


Ответы (1)


Как намекают комментарии, пожалуйста, прочитайте о SQL-инъекциях и попрактикуйтесь в их использовании. См. здесь и здесь. Также взгляните на PDO (настоятельно рекомендую это вместо mysqli) и здесь руководство о том, с чего начать работу с PDO

Ниже приведено очень простое и простое начало привязки параметров, чтобы предотвратить внедрение sql:

$t = $_POST['t'];//Post data, you should probably validate this
$sql = $db->prepare("INSERT INTO `gift` (`t`, `p`, `a`, `c`, `ph`, `e`) 
        VALUES (:t, :p, :a, :c, :ph, :e)");// :t is your bind parameter
$sql->bindParam('t', $t);//bind t (:t) to $t

Если вы не хотите заполнять свой код несколькими строками «bindParam», вы можете применить их все непосредственно к методу выполнения.

//where [] is an array of values in the order of your column parameters 
//e.g. $_POST (Thanks Xorifelse )
$sql->execute([]);

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

На этом сайте есть некоторая информация о том, почему это хорошо использовать правильные соглашения об именах (например, useApproriateNamesSoIknowWhatThisIsInAYear)

person Community    schedule 18.07.2018
comment
Вы можете забыть о bindParam(), просто анализируйте значения непосредственно в массиве $pdo->execute([':t' => $_POST['t'], etc..]). - person Xorifelse; 19.07.2018
comment
О да...! Я обновлю ответ, чтобы включить это. Спасибо - person ; 19.07.2018
comment
Насчет названий столбцов - я изменил их имена только здесь. Я назвал их на своем языке, чтобы вы их не поняли. - person szpanel; 19.07.2018
comment
@szpanel Ах, ну, вы, вероятно, должны были упомянуть, что в своем ОП, даже если мы их не понимаем, у нас все еще есть переводчик Google, если мы их не понимаем. Когда вы будете публиковать просьбы о помощи в будущем, включите английские версии переменных/столбцов (или чего-то, к чему они относятся), потому что это поможет тем, кто пытается ответить на ваш вопрос, дать более подходящий ответ :) - person ; 19.07.2018
comment
В следующий раз постараюсь написать лучше. Я думаю, что мне нужно переспать с ним и прочитать ваш ответ утром. Спасибо, может быть, я спрошу что-нибудь завтра. - person szpanel; 19.07.2018