PHP, вторичный ключ MYSQL

0

Я не могу понять, что я не так. Я создаю приложение для Android, где люди регистрируются, чтобы ввести свой номер телефона, а затем в другом действии они вводят имя и фамилию и регистрация завершена. Проблема в том, что у меня есть база данных с двумя таблицами, одна из которых называется "Числа" (поля - это идентификатор и номер телефона), а таблица "Клиенты" (поля - это ID, имя, фамилия и idNumbers_fk). Я не могу сохранить данные во второй таблице, как мне управлять вторичным ключом? В том смысле, что вы связаны с первичным ключом таблицы "Числа", но я не могу передать его значение в поле "Идентификатор". У меня есть PHP-код для вставки данных в таблицы, но я не понимаю, почему он не работает.

Вы можете мне помочь?

Вот что я имею в db: NAME DATABASE: Test1 КОЛИЧЕСТВО ТАБЛИЦ: 2

ТАБЛИЦА 1:

  • ТАБЛИЦА ИМЕНИ: Числа
  • FIELDS: идентификатор (PK) и номер телефона (VARCHAR (20))

ТАБЛИЦА 2:

  • ТАБЛИЦА ИМЕНИ: Costumers
  • FIELDS: идентификатор (PK), имя (VARCHAR (20)), фамилия (VARCHAR (20)) и idNumbers_fk (внешний ключ)

Вот мой код PHP для регистрации номера телефона (это работает):

<?php
if($_SERVER['REQUEST_METHOD']=='POST'){

include 'Test1config.php';

 $con = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName);

 $Pnumber = $_POST['NumberPhone'];


 $CheckSQL = "SELECT * FROM Numbers WHERE Phone_number='$Pnumber'";

 $check = mysqli_fetch_array(mysqli_query($con,$CheckSQL));

 if(isset($check)){

 echo 'Number already registered';

 }
else{ 
$Sql_Query = "INSERT INTO Numbers (Phone_number) values ('$Pnumber')";

 if(mysqli_query($con,$Sql_Query))
{
 echo 'Registration Successfully';
}
else
{
 echo 'Something went wrong';
 }
 }
}
 mysqli_close($con);
?>

Это код файла PHP, который дает мне ошибку, здесь я вставляю данные в таблицу "Costumers", но это дает мне ошибку, но если я удалю внешний ключ из таблицы "Costumers", это работает, почему? Где я ошибаюсь?

<?php

   if($_SERVER['REQUEST_METHOD']=='POST'){

       include_once("Test2congig.php");

        $first_name = $_POST['nameC'];
        $last_name = $_POST['surnameC'];


     if($first_name == '' || $last_name == '' ){
            echo json_encode(array( "status" => "false","message" => "Parameter missing!") );
     }else{

            $query= "SELECT * FROM Costumers WHERE Name='$first_name' AND Surname='$last_name'";
            $result= mysqli_query($con, $query);

            if(mysqli_num_rows($result) > 0){  
               echo json_encode(array( "status" => "false","message" => "User already exist!") );
            }else{ 
             $query = "INSERT INTO Costumers (Name,Surname) VALUES ('$first_name','$last_name')";
             if(mysqli_query($con,$query)){

                 $query= "SELECT * FROM Costumers ";
                         $result= mysqli_query($con, $query);
                     $emparray = array();
                         if(mysqli_num_rows($result) > 0){  
                         while ($row = mysqli_fetch_assoc($result)) {
                                     $emparray[] = $row;
                                   }
                         }
                echo json_encode(array( "status" => "true","message" => "Successfully registered!" , "data" => $emparray) );
             }else{
                 echo json_encode(array( "status" => "false","message" => "Error occured, please try again!") );
            }
        }
                mysqli_close($con);
     }
     } else{
            echo json_encode(array( "status" => "false","message" => "Error occured, please try again!") );
    }

 ?>
  • 2
    Ваш код уязвим для атак SQL-инъекций. Вы должны использовать параметризованные запросы и подготовленные операторы, чтобы помочь злоумышленникам не скомпрометировать вашу базу данных, используя вредоносные входные значения. bobby-tables.com дает объяснение рисков, а также некоторые примеры того, как написать ваши запросы безопасно, используя PHP / mysqli. Никогда не вставляйте неанизированные данные прямо в ваш SQL.
  • 0
    В любом случае, я думаю, что ваш запрос не выполняется, потому что ваш INSERT в Costumers должен включать значение для поля idNumbers_fk, чтобы удовлетворить ограничения внешнего ключа. Вам необходимо связать пользователя с его номером телефона. Не совсем понятно, почему вы просто не делаете все это за один шаг, вместо того, чтобы попросить пользователя заполнить две формы? Также из вашей структуры таблиц видно, что многие учетные записи пользователей могут быть связаны с одним и тем же номером телефона - это то, что вы хотите?
Показать ещё 7 комментариев
Теги:

1 ответ

1
Лучший ответ

В вашей Costumers таблице, сделать поле idNumbers_fk значения по умолчанию NULL. Таким образом, когда вы не установите данные в это поле, это будет NULL, что является приемлемым значением внешнего ключа.

Причина, по которой это не удается, заключается в том, что по умолчанию по умолчанию установлено значение 0, и в таблице Numbers нет номеров телефонов с id из 0.

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

Как это:

INSERT INTO Costumers (Name,Surname,idNumbers_fk) VALUES ('$first_name','$last_name', '$phoneNumberIdFromSomeSessionOrCache')

$phoneNumberIdFromSomeSessionOrCache - это значение, которое необходимо сохранить после того, как клиент сохранит номер телефона...

  • 0
    что ж, это может предотвратить ошибку, но не поможет найти полезное решение - OP необходимо связать номер телефона с данными пользователя.
  • 0
    @ Адисон У него там два отдельных процесса, то, о чем вы говорите, это еще один шаг. Я говорю ему, что вызывает его проблему там.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню