Результаты запроса SQL отличаются от переменных

#php #mysql #sql

#php #mysql #sql

Вопрос:

Я хочу задать параметр URL с помощью функции uniqid в php, я получаю уникальные номера и помещаю их в свою базу данных, используя их в скрытой форме ввода. Я пытаюсь сделать так, чтобы в начале скрипта $ number присваивался uniqid, который я поместил в скрытый ввод, чтобы он был размещен в базе данных, и я мог использовать ту же переменную для создания ссылки href.

Проблема, с которой я сталкиваюсь, заключается в том, что значение, хранящееся в моей базе данных, не совпадает со значением, хранящимся в переменной number, используемой в ссылке href, что делает ссылку бесполезной. Как мне получить оба значения равными, есть ли лучший способ сделать то, что я пытаюсь сделать?

Я попытался поместить uniqid () в функцию

 <?php
$servername = "localhost";
$username = "root";
$password = "";
$homeDB = "homeDB";

$conn = new mysqli($servername, $username, $password, $homeDB);

if($conn->connect_error) {
    die("failed to connect to server".$conn->connect_error);
} 
$number = uniqid();
if(isset($_POST["namn"])) {  
    $sql = "INSERT INTO information (firstname, lastname, urlID)
            VALUES ('".$_POST["namn"]."','".$_POST["efternamn"]."',
                    '".$_POST["hide"]."')";

    if($conn->query($sql)== TRUE){
        $link = "http://localhost/sqltutorial/execute.php?id=".$number;

    } else {
        echo "failed";
    }

    echo $link;
}
  

HTML

 <html>
<body>
    <form method="post" action="home.php">
    <input type="text" name="namn"> <br>
    <input type="text" name= "efternamn"><br>
    <input type="hidden" value="<?php $number ?>" name="hide">
    <input type="submit" >
    </form>
    <br>

</body>
</html>
  

Я получаю разные значения по ссылке, которая повторяется, и значение, хранящееся в моей базе данных (я знаю, что эта форма небезопасна)

Комментарии:

1. Предупреждение: Ваш код уязвим для атак с использованием SQL-инъекций. Вы должны использовать параметризованные запросы и подготовленные инструкции, чтобы предотвратить компрометацию вашей базы данных злоумышленниками с помощью вредоносных входных значений. bobby-tables.com приводится объяснение рисков, а также несколько примеров того, как безопасно писать ваши запросы, используя PHP / mysqli. Никогда не вставляйте неподтвержденные данные непосредственно в ваш SQL. При том, как написан ваш код сейчас, кто-то может легко украсть, неправильно изменить или даже удалить ваши данные.

Ответ №1:

Я думаю, вам просто нужно использовать $_POST['hide'] значение в ссылке.

Также было бы лучше повторять ссылку, только если она была создана. Там, где у вас есть echo в данный момент, можно повторить $link переменную, даже если она не была создана!

 <?php
$servername = "localhost";
$username = "root";
$password = "";
$homeDB = "homeDB";

$conn = new mysqli($servername, $username, $password, $homeDB);

if($conn->connect_error) {
    die("failed to connect to server".$conn->connect_error);
} 

$number = uniqid();

if(isset($_POST["namn"])) {  
    $sql = "INSERT INTO information (firstname, lastname, urlID)
            VALUES ('".$_POST["namn"]."','".$_POST["efternamn"]."',
                    '".$_POST["hide"]."')";

    if($conn->query($sql)== TRUE){
        $link = "http://localhost/sqltutorial/execute.php?id=$_POST[hide]";
        // line moved to here
        echo $link;
    } else {
        echo "failed";
    }        
}
  

Ответ №2:

Проблема в том, что при выполнении обратной передачи вы также снова запускаете строку $number = uniqid(); . Таким образом, конечное число, которое выводится, не является тем, которое вы поместили в скрытое поле.

Теперь вы могли бы написать

 $link = "http://localhost/sqltutorial/execute.php?id=".$_POST["hide"];
  

и это вывело бы число, которое было передано в переменной POST.


Или вы могли бы просто подождать, пока произойдет обратная передача, чтобы сгенерировать уникальный идентификатор и использовать его как при вызове базы данных, так и при выводе. Это экономит а) время обратного перехода переменной в браузер и обратно на сервер и б) любого, кто пытается изменить данные формы. Поэтому переместите код создания числа внутрь if :

 if(isset($_POST["namn"])) {
  $number = uniqid();
  

… а затем замените обе ссылки на $_POST["hide"] на $number вместо этого. Вы также можете удалить скрытое поле из своей формы.


Последнее альтернативное предложение: вам вообще нужно это делать? Я предполагаю, что в вашей таблице базы данных в качестве первичного ключа используется целочисленное поле auto_increment? Почему бы просто не использовать значение, уже генерируемое базой данных, в качестве значения для вашей ссылки?

 if($conn->query($sql)== TRUE){
  $link = "http://localhost/sqltutorial/execute.php?id=".$conn->insert_id;
  

получил бы автоматически сгенерированный идентификатор последней вставленной вами строки и использовал бы его вместо ссылки. Смотрите также документацию

Я не вижу особой цели в создании второго идентификатора для вашей строки (тем более, что uniqid () не обещает всегда предоставлять вам полностью уникальное значение), если только у вас нет какой-то конкретной причины?

Ответ №3:

Итак, вы хотите создать строку и перенаправить по этой ссылке после создания.

Шаги:

1) Сначала получите следующее значение автоматического увеличения для этой informations таблицы с помощью этой функции и сохраните его в $number .

     $stmt = $this->db->prepare("SHOW TABLE STATUS LIKE 'informations'");
    $stmt->execute();
    $result = $stmt->fetchAll();
    foreach ($result as $row) {
        $number = $row[10];
    }
  

2) Теперь выполните вставку, и после вставки вы получите тот же идентификатор автоинкремента и будете делать все с этим.

Надеюсь, это поможет.

ПРИМЕЧАНИЕ: Вы также можете создать функцию для получения этого идентификатора автоматического увеличения для любой таблицы.

Комментарии:

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

2. Это подход, вы определенно можете получить значение? Вы проверили код?

3. 1) для этого есть соответствующая функция, которую вы запускаете после вставки (см. php.net/manual/en/mysqli.insert-id.php — это то, что рекомендуется и используется всеми), 2) Я далек от убеждения, что ваш подход (который я никогда не видел, чтобы кто-либо защищал раньше) сработал бы в случае параллельных вставок… Я не понимаю, как вы могли бы гарантировать получение правильного идентификатора, если два человека пытались получить это значение сразу, а затем сразу вставить. Существует высокая вероятность того, что им обоим будет присвоен один и тот же идентификатор, что затем приведет к ошибке нарушения ключа. Но в любом случае, в этом нет необходимости — см. 1)