2016-04-13 7 views
1

Итак, у меня есть 3 стола: donor, blood_type, user_account. Я пытаюсь заполнить таблицу donor, которая содержит user_id и blood_id, но нет никакого соединения между blood_group и user_account столом, поэтому я попробовал это, но это не сработало. Может кто-нибудь рассказать, что я делаю неправильно? Я очень новичок в php и базах данных.INSERT in mySQL

<?php 
if(isset($_POST['submit'])) { 

    $conn = mysqli_connect("localhost", "root" , ""); 

    if(!$conn) { 
     die("Cannot connect: "); 
    } 

    mysqli_select_db($conn,"blood_bank_project"); 

    $sql = "INSERT INTO user_account(username, password) VALUES ('$_POST[user]', '$_POST[psw]');"; 
    $sql .="INSERT INTO donor(first_name,last_name,email_add,gender, birthday, telephone, city, last_donation,user_id, blood_id)VALUES('$_POST[fname]', '$_POST[lname]', '$_POST[email]', '$_POST[gender]', '$_POST[Birthday]', '$_POST[Telephone]', '$_POST[city]', '$_POST[lastdonation]')"; 
    $sql .="UPDATE donor SET blood_id = (SELECT blood_id from blood_type where blood_group= '$_POST[bloodgroup]');"; 
    $sql .="UPDATE donor SET user_id = (SELECT user_id from user_account where username= '$_POST[user]')"; 

    if(mysqli_multi_query($conn, $sql)){ 
     echo'executed'; 
    } 
} 
?> 
+1

Почтовый код и ваш результат, иначе вы получите много голосов. – Xogle

+0

Я отправил его по какой-то причине – loreen99

+0

Используйте инструмент разметки '{}' в редакторе SO. – Barmar

ответ

0

Theres несколько вещей неправильно с этим фрагментом коды:

  1. Line 15: У вас есть плут 'W' в начале строки перед вашим $ SQL переменной
  2. Все ваших параметров $ _POST должны быть в формате $ _POST ['parameter'] (Пропущенные кавычки, не забудьте уйти от уже указанных котировок в местах)
  3. Запрос подвыборки предложения where в строке 14 выбирает из таблица, которая не существует (blood_type)

Я предполагаю, что ваше стремление к достижению - это сопоставление между «user_account» и «donor», из которых вам может быть лучше либо хранить внешний ключ в таблице учетных записей пользователя «donor_id», либо матрицу/сопоставление таблицу, которая связывает их вместе.

Таблица матриц/сопоставлений должна содержать дату первичного ключа от пользователя user_account и донора для создания вашей матрицы.

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

Я также убедитесь, что ваш спасаясь ваши входящие переменные в запросах, чтобы предотвратить любые SQL Injection атак (see here)

2

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

INSERT INTO donor (user_id, blood_id, first_name,last_name,email_add,gender, birthday, telephone, city, last_donation) 
SELECT u.user_id, b.blood_id, 
     '$_POST[fname]', '$_POST[lname]', '$_POST[email]', '$_POST[gender]', '$_POST[Birthday]', '$_POST[Telephone]', '$_POST[city]', '$_POST[lastdonation]' 
FROM user_accounts AS u 
CROSS JOIN blood_type AS b 
WHERE u.username = '$_POST[user]' AND b.blood_group= '$_POST[bloodgroup]' 

Я также настоятельно рекомендую вам использовать подготовленные запросы вместо подстановки $_POST переменных, так как последние субъекты вас к SQL-инъекции. Я также рекомендую не использовать mysqli_multi_query - он редко нужен и только делает проверку на успех сложнее. Если вы вставляете в user_accounts с помощью отдельного запроса, вы можете использовать mysqli_insert_id($conn) для получения user_id, назначенного при вставке в user_accounts, вместо использования вышеприведенного JOIN. Вы также можете использовать встроенную функцию MySQL LAST_INSERT_ID(), чтобы получить ее.

$stmt = mysqli_prepare($conn, "INSERT INTO user_account(username, password) VALUES (?, ?);") or die("Can't prepare user_account query: " . mysqli_error($conn)); 
mysqli_stmt_bind_param($stmt, "ss", $_POST['user'], $_POST['psw']); 
mysqli_execute($stmt); 
$stmt2 = mysqli_prepare($conn, " 
    INSERT INTO donor (user_id, blood_id, first_name,last_name,email_add,gender, birthday, telephone, city, last_donation) 
    SELECT LAST_INSERT_ID(), b.blood_id, ?, ?, ?, ?, ?, ?, ?, ? 
    FROM blood_type AS b 
    WHERE b.blood_group= ?") or die ("Can't prepare donor query: " . mysqli_error($conn)); 
mysqli_stmt_bind_param($stmt2, "sssssssss", $_POST['fname'], $_POST['lname'], $_POST['email'], $_POST['gender'], $_POST['Birthday'], $_POST['Telephone'], $_POST['city'], $_POST['lastdonation'], $_POST['bloodgroup']); 
mysqli_execute($stmt2); 
+0

Это не сработает. – loreen99

+0

$ sql = "INSERT INTO user_account (имя пользователя, пароль) VALUES ('$ _POST [пользователь]', '$ _POST [psw]');"; $ sql. = "INSERT INTO donor (user_id, blood_id, first_name, last_name, email_add, пол, день рождения, телефон, город, last_donation) SELECT u.user_id, b.blood_id, '$ _POST [fname]', '$ _POST [lname] ',' $ _POST [email] ',' $ _POST [пол] ',' $ _POST [День рождения] ',' $ _POST [Телефон] ',' $ _POST [город] ',' $ _POST [lastdonation ] 'FROM user_accounts AS u CROSS JOIN blood_type AS b WHERE u.username =' $ _POST [user] 'AND b.blood_group =' $ _POST [bloodgroup] '"; (mysqli_multi_query ($ conn, $ sql) – loreen99

+0

Что такое сообщение об ошибке? – Barmar