Вставка значений в разные таблицы на основе переменных - PullRequest
0 голосов
/ 30 апреля 2020
     $username = $_POST['uid'];
      $email = $_POST['mail'];
      $password = $_POST['pwd'];
      $passwordRepeat = $_POST['pwd-repeat'];
      $date = $_POST['date2'];
      $stream = $_POST['relationship'];

            $sql1 = "INSERT INTO users (uidUsers, emailUsers, pwdUsers, relationship) VALUES (?, ?, ?, ?);";
            $sql2 = "INSERT INTO Family1 (username, application_filed, relationship) VALUES (?, ?, ?);";
            $sql3 = "INSERT INTO Family2 (username, application_filed, relationship) VALUES (?, ?, ?);";
            mysqli_query($sql1, $conn);
            mysqli_query($sql2, $conn);
            mysqli_query($sql3, $conn);

       $stmt = mysqli_stmt_init($conn);
            if (!mysqli_stmt_prepare($stmt, $sql2)) {
              header("Location: ../signup.php?error=sqlerror");
              exit();
            }
                    else {

              mysqli_stmt_bind_param($stmt, "sss", $username, $date, $stream);
              $result = mysqli_stmt_get_result($stmt);
              if ($row = mysqli_fetch_assoc($result))
              ($username==$_SESSION['uid'] and $stream =='nursing');
                mysqli_stmt_execute($stmt);
            }

            if (!mysqli_stmt_prepare($stmt, $sql3)) {
              header("Location: ../signup.php?error=sqlerror");
              exit();
            }
                    else {

              mysqli_stmt_bind_param($stmt, "sss", $username, $date, $stream);
              $result = mysqli_stmt_get_result($stmt);
              if ($row = mysqli_fetch_assoc($result))
              ($username==$_SESSION['uid'] and $stream =='doctoral');
                mysqli_stmt_execute($stmt);
            }

            if (!mysqli_stmt_prepare($stmt, $sql1)) {
              header("Location: ../signup.php?error=sqlerror");
              exit();
            }

     if (!mysqli_stmt_prepare($stmt, $sql1)) {
              header("Location: ../signup.php?error=sqlerror");
              exit();
            }
            else {
              $hashedPwd = password_hash($password, PASSWORD_DEFAULT);
              mysqli_stmt_bind_param($stmt, "ssss", $username, $email, hashedPwd,$stream);
              mysqli_stmt_execute($stmt);
              header("Location: ../signup.php?signup=success");
              exit();



/////////////New Code////////////////
  $username = $_POST['uid'];
  $email = $_POST['mail'];
  $password = $_POST['pwd'];
  $passwordRepeat = $_POST['pwd-repeat'];
  $date = $_POST['date2'];
  $stream = $_POST['relationship'];

        $sql1 = "INSERT INTO users (uidUsers, emailUsers, pwdUsers, relationship) VALUES (?, ?, ?, ?);";
        $sql2 = "INSERT INTO Family1 (username, application_filed, relationship) VALUES (?, ?, ?);";
        $sql3 = "INSERT INTO Family2 (username, application_filed, relationship) VALUES (?, ?, ?);";

    $stmt = mysqli_stmt_init($conn);
        if (!mysqli_stmt_prepare($stmt, $sql2)) {
          header("Location: ../signup.php?error=sqlerror");
          exit();
        } else if ($username==$_SESSION['uid'] && $stream =='nursing') {
    mysqli_stmt_bind_param($stmt, "sss", $username, $date, $stream);
    mysqli_stmt_execute($stmt);
        }

        if (!mysqli_stmt_prepare($stmt, $sql3)) {
          header("Location: ../signup.php?error=sqlerror");
          exit();
        }
        else if ($username==$_SESSION['uid'] && $stream =='doctoral') {
    mysqli_stmt_bind_param($stmt, "sss", $username, $date, $stream);
    mysqli_stmt_execute($stmt);
        }

        if (!mysqli_stmt_prepare($stmt, $sql1)) {
          header("Location: ../signup.php?error=sqlerror");
          exit();
        }
        else {

           $hashedPwd = password_hash($password, PASSWORD_DEFAULT);

          mysqli_stmt_bind_param($stmt, "ssss", $username, $email, $hashedPwd, $stream);
          mysqli_stmt_execute($stmt);
          header("Location: ../signup.php?signup=success");
          exit();

        }

Мне было интересно, может ли кто-нибудь указать мне правильное направление. У меня есть этот код. Они думают, что за этим стоит вставить значения в разные таблицы в зависимости от передаваемых переменных.

Поэтому, когда пользователь заполняет форму и выбирает $ stream = "nursing", я хочу получить результаты go для таблицы 'users' и 'Family1', но не для таблицы 'Family2'. и если пользователь выбирает $ stream = 'doctoral', результаты должны go в таблице 'users' и 'Family2', а не go в 'Family1'

Но с моим запросом я получаю результаты go как в таблицу, так и в таблицу пользователей. И нет никаких ограничений на то, что выбирают пользователи, передавая переменную $ stream, независимо от того, что это такое.

Это неправильный путь к go здесь? Я полностью испортил логику c?

1 Ответ

0 голосов
/ 30 апреля 2020

Во-первых, вызовы mysqli_query() в верхней части будут пытаться выполнить запросы и завершатся неудачно, поскольку не имеют представления о заполнителях ?, а у вас переменные $conn и $sqlX неверны

Но помимо этого, позвольте мне исправить отступ для вас, чтобы вы могли видеть, что на самом деле происходит для одного из ваших утверждений:

$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql2)) {
    header("Location: ../signup.php?error=sqlerror");
    exit();
} else {
    mysqli_stmt_bind_param($stmt, "sss", $username, $date, $stream);
    $result = mysqli_stmt_get_result($stmt);

    if ($row = mysqli_fetch_assoc($result))
        ($username==$_SESSION['uid'] and $stream =='nursing');

    mysqli_stmt_execute($stmt);
}

Видите ли вы, что здесь происходит?

$sql2 - это запрос INSERT. Если вы смогли подготовить этот оператор, вы пытаетесь получить результат до того, как запрос будет выполнен . Если вам удастся получить строку данных из этого результата (, которую вы не можете , поскольку запрос INSERT не возвращает никаких записей), вы затем проверяете $username и $stream, которые имеют нет эффекта. Вызов для выполнения подготовленного оператора выполняется независимо от того, удалось ли вам получить что-либо из $result.

Все ваши операторы имеют одинаковые проблемы, поэтому я только исправлю это.

Вот что я изменил:

  • Весь шаг $result казался ненужным, поэтому я удалил его.
  • Я заменил and на && из-за моего личного предпочтение. Когда-то была причина, почему это стало моим предпочтением, но я забыл. Это главным образом для согласованности между языками программирования, так как многие языки используют &&, и только некоторые используют and.
  • Поскольку нет смысла связывать параметры с оператором, который вы не планируете выполнять, я переместил это в операторе if.
  • Поскольку теперь у меня получилась конструкция else { if { ... } }, я упростил ее до else if { ... } для более чистого кода.
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql2)) {
    header("Location: ../signup.php?error=sqlerror");
    exit();
} else if ($username==$_SESSION['uid'] && $stream =='nursing') {
    mysqli_stmt_bind_param($stmt, "sss", $username, $date, $stream);
    mysqli_stmt_execute($stmt);
}

Теперь запрос $sql2 выполняется только в том случае, если $username соответствует текущему uid из сеанса и пользователь выбрал поток nursing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...