Ok so whilst I have been working on my PHP and MySQL skills I am new to inserting data into multiple tables in one go. I have done some reading around the subject and I appreciate the basics and the importance of normalised data etc and as such the need to put the information into various tables.
I have pieced the code below together from some of my previous work as well as the tutorial offered at http://www.desilva.biz/mysql/insertid.html . The issue I currently face is that the tutorial I learnt the code from for inputting into various tables was not based around an array of data and whilst I have got it to almost work I cannot use my fuelrecords_id because where I have to call it in my current code it has not yet been defined. Therefore to make my code work at present I just have to use a comma for the column.
Finally I would like to perfect a way to make the if statements work correctly with the array data so if a 0 or blank is submitted as part of the array a new row is not inserted with just 0's in my database tables for that respective row of data
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
$con = mysql_connect("ip","username","password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("jbsrint", $con);
//New Code
$row_data = array();
foreach($_POST['VEH_LIST_REG'] as $row=>$VEH_LIST_REG) {
$WEDATE=$wed_refor;
$VEH_LIST_REG=mysql_real_escape_string($VEH_LIST_REG);
$FR_DIE_L=mysql_real_escape_string($_POST['FR_DIE_L'][$row]);
$FR_DIE_C=mysql_real_escape_string($_POST['FR_DIE_C'][$row]);
$FR_PET_L=mysql_real_escape_string($_POST['FR_PET_L'][$row]);
$FR_PET_C=mysql_real_escape_string($_POST['FR_PET_C'][$row]);
$FR_OIL_L=mysql_real_escape_string($_POST['FR_OIL_L'][$row]);
$FR_OIL_C=mysql_real_escape_string($_POST['FR_OIL_C'][$row]);
$row_data[] = "(',', '$VEH_LIST_REG', '$WEDATE')";
$row_data1[] = "(',','$FR_DIE_L', '$FR_DIE_C', ',')";
$row_data2[] = "(',', '$FR_PET_L', '$FR_PET_C', ',')";
$row_data3[] = "(',', '$FR_OIL_L', '$FR_OIL_C', '$FR_OIL_C')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
#$result = mysql_query( $query);
# get fuelrecord id
$fuelrecords_ID = mysql_insert_id();
# if the user submitted diesel information
if( isset($FR_DIE_L) )
{
# and insert the diesel details
$sql = "INSERT INTO fuelrecords_die(FRD_ID,FR_DIE_L,FR_DIE_C,fuelrecords_ID) VALUES ".implode(',', $row_data1);
$result = mysql_query( $sql);
}
# if the user submitted petrol information
if( isset($FR_PET_L) )
{
# and insert the diesel details
$sql = "INSERT INTO fuelrecords_pet(FRP_ID,FR_PET_L,FR_PET_C,fuelrecords_ID) VALUES ".implode(',', $row_data2);
$result = mysql_query( $sql);
}
# if the user submitted oil information
if( isset($FR_OIL_L) )
{
# and insert the oil details
$sql = "INSERT INTO fuelrecords_oil(FRO_ID,FR_OIL_L,FR_OIL_C,fuelrecords_ID) VALUES ".implode(',', $row_data3);
$result = mysql_query( $sql);
}
if (mysql_query($query))
echo '<font color=\"FFFFFF\" size=\"3px\">Successful inserted</font>';
else
echo '<font color=\"FFFFFF\" size=\"3px\">Insert failed</font>';
}
?>
<?php
mysql_close($con)
?>
Tables are as follows:
fuelrecords
FR_ID (Auto increment)
VEH_LIST_REG
FR_WE
fuelrecords_die
FRD_ID (AUTO INCREMENT)
FR_DIE_L
FR_DIE_C
fuelrecords_ID (foreign ID from fuelrecords)
fuelrecords_pet
FRP_ID (AUTO INCREMENT)
FR_PET_L
FR_PET_C
fuelrecords_ID (foreign ID from fuelrecords)
fuelrecords_oil
FRO_ID (AUTO INCREMENT)
FR_OIL_L
FR_OIL_C
fuelrecords_ID (foreign ID from fuelrecords)
Basically the purpose is to log vehicle fuel usage and cost. As there wont always be data for petrol, diesel and oil hence the separate tables so only needed dat is logged.
Hope this clarifies
A always all help and assistance is much appreciated.
If I understand your code correctly you have 4 tables: fuelrecords, fuelrecords_die, fuelrecords_pet, fuelrecords_oil.
The 3 tables fuelrecords_die, fuelrecords_pet, fuelrecords_oil each have a foreign key fuelrecords_id to fuelrecords.fr_id.
You now want to insert multiple tuples into fuelrecords and, if additional data is provided, multiple tuples into the other 3 tables. I assume the fuelrecords.fr_id column is a auto incrementing primary key.
To insert multiple tuples into fuelrecords and to have them each have a new fr_id, you just don't pass a value for the column fr_id. This is equivalent to passing NULL as value. MySQL will then automatically insert unique consecutive numbers for each tuple.
After that you can call mysql_insert_id() to get the first inserted id. Using mysql_affected_rows() you can get the number of inserted tuples. This is enough information to get the id for all lastly inserted tuples. The first is mysql_insert_id()+0 the second is mysql_insert_id()+1, ..., the last is mysql_insert_id()+(mysql_affected_rows()-1).
In the next step you iterate over your input data again and insert the fuelrecords_id into each of the tuples for the other 3 tables, using the above mentioned method. If $i is the index of your input data $_POST['FR_DIE_L'][$i] (starting at $i==0), the fuelrecords_id will be mysql_insert_id()+$i. You are only allowed to iterate to mysql_insert_id()+mysql_affected_rows()-1, but you will probably have the same count of POST-data anyways.
A much simpler but slightly less efficient way is to just do one insert into fuelrecords and then one insert into the other 3 tables for each single POST-data object. You won't have to calculate the fuelrecords_id as mysql_insert_id() will give you the correct id after each insert.
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
$row_data = array();
// shorthand for mysql_real_escape_string
function esc($value) {
return mysql_real_escape_string($value);
}
// all tuples for fuelrecords to be inserted
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
$row_data[] = "(NULL, '".esc($VEH_LIST_REG)."', '".esc($wed_refor)."')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
$result = mysql_query($query);
# get first fuelrecord id
$first_fuelrecords_id = mysql_insert_id();
// all tuples for the other 3 tables. insert only if data is givin.
$die_data = array();
$pet_data = array();
$oil_data = array();
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
// calculate the right fuelrecords_id for this tuple
$fuelrecords_id = (int)($first_fuelrecords_id + $row);
// insert for fuelrecords_die
if (isset($_POST['FR_DIE_L'][$row]))
{
$die_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_DIE_L'][$row])."', '".esc($_POST['FR_DIE_C'][$row])."')";
}
// insert for fuelrecords_pet
if (isset($_POST['FR_PET_L'][$row]))
{
$pet_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_PET_L'][$row])."', '".esc($_POST['FR_PET_C'][$row])."')";
}
// insert for fuelrecords_oil
if (isset($_POST['FR_OIL_L'][$row]))
{
$oil_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_OIL_L'][$row])."', '".esc($_POST['FR_OIL_C'][$row])."')";
}
}
// insert the tuples into fuelrecords_die
if (!empty($die_data))
{
$sql = "INSERT INTO fuelrecords_die(FRD_ID, fuelrecords_ID, FR_DIE_L, FR_DIE_C) VALUES ".implode(',', $die_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_pet
if (!empty($pet_data))
{
$sql = "INSERT INTO fuelrecords_pet(FRP_ID, fuelrecords_ID, FR_PET_L, FR_PET_C) VALUES ".implode(',', $pet_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_oil
if (!empty($oil_data))
{
$sql = "INSERT INTO fuelrecords_oil(FRO_ID, fuelrecords_ID, FR_OIL_L, FR_OIL_C) VALUES ".implode(',', $oil_data);
$result = mysql_query( $sql);
}
}
?>
A small off-topic addition: Try not to use upper case variable names. Upper case identifiers are usually preserved for constants:
define("MY_SHORT_PI", 3.14159265);
define("MY_CONST", "foobar");
$my_variable = "bat";
echo "I am a constant ".MY_SHORT_PI;
echo "Me too ".MY_CONST;
echo "I am a variable ".$my_variable;
This won't have any effect on the PHP interpreter. It's just a common notation to make your code readable for others. There are many style guides out there like the one from PEAR.
Second Example (see comments)
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
// VALUES strings for fuelrecords
$row_data = array();
// temporary storage for just _L and _C values
$die_data_tmp = array();
$pet_data_tmp = array();
$oil_data_tmp = array();
// VALUES strings for the three tables
$die_data = array();
$pet_data = array();
$oil_data = array();
// shorthand for mysql_real_escape_string
function esc($value) {
return mysql_real_escape_string($value);
}
// all tuples for fuelrecords to be inserted
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
// check if diesel values are greater than 0
if (0 < (int)$_POST['FR_DIE_L'][$row] && 0 < (int)$_POST['FR_DIE_C'][$row])
$die_data_tmp[$row] = array($_POST['FR_DIE_L'][$row], $_POST['FR_DIE_C'][$row]);
// check if petrolium values are greater than 0
if (0 < (int)$_POST['FR_PET_L'][$row] && 0 < (int)$_POST['FR_PET_C'][$row])
$pet_data_tmp[$row] = array($_POST['FR_PET_L'][$row], $_POST['FR_PET_C'][$row]);
// check if oil values are greater than 0
if (0 < (int)$_POST['FR_OIL_L'][$row] && 0 < (int)$_POST['FR_OIL_C'][$row])
$oil_data_tmp[$row] = array($_POST['FR_OIL_L'][$row], $_POST['FR_OIL_C'][$row]);
// check if at least one of the 3 tables will get tuples. if not just continue
// with the next and don't assign this fuelrecord tuple to $row_data
if (! isset($die_data_tmp[$row]) && ! isset($pet_data_tmp[$row]) && ! isset($oil_data_tmp[$row]))
continue;
// all values are at least 1, so add this tuple to our inserts
$row_data[$row] = "(NULL, '".esc($VEH_LIST_REG)."', '".esc($wed_refor)."')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
$result = mysql_query($query);
# get first fuelrecord id
$current_fuelrecords_id = mysql_insert_id();
// all tuples for the other 3 tables. insert only if data is givin.
foreach($row_data as $row => $VEH_LIST_REG) {
// insert for fuelrecords_die
if (isset($die_data_tmp[$row]))
{
$die_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($die_data_tmp[$row][0])."', '".esc($die_data_tmp[$row][1])."')";
}
// insert for fuelrecords_pet
if (isset($pet_data_tmp[$row]))
{
$pet_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($pet_data_tmp[$row][0])."', '".esc($pet_data_tmp[$row][1])."')";
}
// insert for fuelrecords_oil
if (isset($oil_data_tmp[$row]))
{
$oil_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($oil_data_tmp[$row][0])."', '".esc($oil_data_tmp[$row][1])."')";
}
// increment the fuelrecords_id for the next tuple.
++$current_fuelrecords_id;
}
// insert the tuples into fuelrecords_die
if (!empty($die_data))
{
$sql = "INSERT INTO fuelrecords_die(FRD_ID, fuelrecords_ID, FR_DIE_L, FR_DIE_C) VALUES ".implode(',', $die_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_pet
if (!empty($pet_data))
{
$sql = "INSERT INTO fuelrecords_pet(FRP_ID, fuelrecords_ID, FR_PET_L, FR_PET_C) VALUES ".implode(',', $pet_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_oil
if (!empty($oil_data))
{
$sql = "INSERT INTO fuelrecords_oil(FRO_ID, fuelrecords_ID, FR_OIL_L, FR_OIL_C) VALUES ".implode(',', $oil_data);
$result = mysql_query( $sql);
}
}
?>
Related
I'm trying to insert multiple records from a text box into a mysql table.
If I enter more than 2 records, it's inserting duplicates.
Here's the code.
What am I doing wrong?
Some more info
Table info
id (int) primary auto_increment
email (varchar)
imei (varchar)
date_ordered (datetime)
status(varchar)
Since it's only the beginning, I have no problems with changing the table structure.
$email = $_SESSION['email'];
$now = time():
$status = "1";
$imeis = $_POST['imeis'];
$row = explode("\n", $imeis);
foreach ($row as $key => $imei)
{
$imei = mysql_real_escape_string($imei);
$query = "SELECT * FROM orders WHERE imei = '$imei'";
$result = mysqli_query($link, $query);
if (mysqli_num_rows($result) == 0)
{
$query1 = "INSERT IGNORE INTO orders (email, imei, date_ordered, status) VALUES ('$email', '$imei', '$now', '$status')";
$result1 = mysqli_query($link, $query1) OR die("fml");
if ($result1)
{
echo "Added $imei<br>";
}
}
else
{
echo "<B>$imei</B> already there<br>";
}
}
It looks like you want each value of imei to be unique in your table. It;s a guess, but it looks like what you're doing.
You do that in SQL by defining the imei column to be unique: that is, by creating a unique index on it. Your present table has an id as a unique (primary) key. You can easily create another one.
My submission form works fine but there are 3 insert queries in the code.
Let me explain why.
Insert Query 1 allows the selected value of the dropdown menu on the form to be inserted into the database table.
Insert Query 2 allows the values inside of a text area box to be inserted into individual separate rows
Insert Query 3 allows all other data to be inserted.
The HTML looks like this (it is wrapped inside of a code but I'll just include a few snippets)...
The dropdown menu:
<select name="Name" id="">
<?php
while ($row = mysql_fetch_array($result)) {
?>
<option value="<?php echo $row['Name']; ?>"><?php echo $row['Name']; ?> </option>
<?php
} ?>
</select>
Yes, I know....it's not using mysqli or PDO at the moment....I've been told that numerous times....
The textarea which will hold multiple lines of values:
<textarea rows="10" cols="35" name="BachelorsDegrees"> </textarea>
Everything else on the form is just <input>. Pretty simple.
The PHP...
Inserting the text area values into the database:
//Writes the information to the database
$text = trim($_POST['BachelorsDegrees']);
$textAr = explode("\n", $text);
$textAr = array_filter($textAr, 'trim'); // remove any extra \r characters left behind
foreach ($textAr as $BachelorsDegrees) {
mysql_query("INSERT INTO Colleges (BachelorsDegrees) VALUES ('$BachelorsDegrees')") or die(mysql_error()) ;
}
Inserting the selected drop down menu value:
//if (isset ($_POST['upload']))
//{
$Name=trim($_POST['Name']);
$ins=mysql_query("INSERT INTO Colleges (Name) VALUES ('$Name')") or die(mysql_error()) ;
if($ins)
{
echo "<br>".$Name."inserted";
}
else
{
echo mysql_error();
}
//}
And inserting everything else:
mysql_query("INSERT INTO Colleges (schoollogo,Motto,Description,Type,ReligiousAffiliation,OtherPartnerships,GenderAdmission,TermType,EntranceExam,EntranceExamDate,TotalEnrolled,collegewebsite,ContactInfo,CampusLocations,Certifications,Diplomas,AssociateDegrees,MastersDegrees,DoctorateDegrees,SpecialDegreePrograms,Accreditation,CostofTuitionLocal,CostofTuitionForeign,Housing,AcceptanceRate,CoE,CoD) VALUES ('$schoollogo', '$Motto', '$Description', '$Type', '$ReligiousAffiliation', '$OtherPartnerships', '$GenderAdmission', '$TermType', '$EntranceExam', '$EntranceExamDate', '$TotalEnrolled', '$collegewebsite', '$ContactInfo', '$CampusLocations', '$Certifications', '$Diplomas', '$AssociateDegrees', '$MastersDegrees', '$DoctorateDegrees','$SpecialDegreePrograms','$Accreditation','$CostofTuitionLocal','$CostofTuitionForeign','$Housing','$AcceptanceRate','$CoE','$CoD')") or die(mysql_error()) ;
When inserted into the database, multiple rows of data are shown.
1 row = College Name (from the drop down menu)
2nd row = the degrees from the text area
3rd row = all other data
How do I combine all insert queries into one query so that I only have 1 row?
Generally you build a single query.
Take each of the values and add them to the query (probably as parameters).
However you appear to have a single table, rather than multiple tables. You would expect to have a table of colleges, and then another table that has a row for each course each college does.
An alternative would be for your first query to return the unique id of the inserted row, and then all your other inserts also insert this id with an ON DUPLICATE KEY UPDATE clause. But this would be messy and slow
EDIT.
Example of a single query. Note that I have just used the deprecated mysql_* functions as that is what you are using, but you should switch to either the mysqli_* functions or to PDO . Either way escaping the data or using parameterised queries is VERY important.
This inserts one record for the college, then uses mysql_insert_id() to get the id field of the inserted field (assuming you have one). This id is then used to insert each of the courses to another table listing the courses for each college:-
<?php
$Name = mysql_real_escape_string(trim($_POST['Name']));
$schoollogo = mysql_real_escape_string(trim($_POST['schoollogo']));
$Motto = mysql_real_escape_string(trim($_POST['Motto']));
$Description = mysql_real_escape_string(trim($_POST['Description']));
$Type = mysql_real_escape_string(trim($_POST['Type']));
$ReligiousAffiliation = mysql_real_escape_string(trim($_POST['ReligiousAffiliation']));
$OtherPartnerships = mysql_real_escape_string(trim($_POST['OtherPartnerships']));
$GenderAdmission = mysql_real_escape_string(trim($_POST['GenderAdmission']));
$TermType = mysql_real_escape_string(trim($_POST['TermType']));
$EntranceExam = mysql_real_escape_string(trim($_POST['EntranceExam']));
$EntranceExamDate = mysql_real_escape_string(trim($_POST['EntranceExamDate']));
$TotalEnrolled = mysql_real_escape_string(trim($_POST['TotalEnrolled']));
$collegewebsite = mysql_real_escape_string(trim($_POST['collegewebsite']));
$ContactInfo = mysql_real_escape_string(trim($_POST['ContactInfo',
$CampusLocations = mysql_real_escape_string(trim($_POST['CampusLocations']));
$Certifications = mysql_real_escape_string(trim($_POST['Certifications']));
$Diplomas = mysql_real_escape_string(trim($_POST['Diplomas']));
$AssociateDegrees = mysql_real_escape_string(trim($_POST['AssociateDegrees']));
$MastersDegrees = mysql_real_escape_string(trim($_POST['MastersDegrees']));
$DoctorateDegrees = mysql_real_escape_string(trim($_POST['DoctorateDegrees']));
$SpecialDegreePrograms = mysql_real_escape_string(trim($_POST['SpecialDegreePrograms']));
$Accreditation = mysql_real_escape_string(trim($_POST['Accreditation']));
$CostofTuitionLocal = mysql_real_escape_string(trim($_POST['CostofTuitionLocal']));
$CostofTuitionForeign = mysql_real_escape_string(trim($_POST['CostofTuitionForeign']));
$Housing = mysql_real_escape_string(trim($_POST['Housing']));
$AcceptanceRate = mysql_real_escape_string(trim($_POST['AcceptanceRate']));
$CoE = mysql_real_escape_string(trim($_POST['CoE']));
$CoD = mysql_real_escape_string(trim($_POST['CoD']));
$ins = mysql_query("INSERT INTO Colleges (Name, schoollogo, Motto, Description,Type, ReligiousAffiliation, OtherPartnerships, GenderAdmission, TermType, EntranceExam, EntranceExamDate, TotalEnrolled, collegewebsite, ContactInfo, CampusLocations, Certifications, Diplomas, AssociateDegrees, MastersDegrees, DoctorateDegrees, SpecialDegreePrograms, Accreditation, CostofTuitionLocal, CostofTuitionForeign, Housing,AcceptanceRate, CoE, CoD)
VALUES ('$Name',
'$schoollogo',
'$Motto',
'$Description',
'$Type',
'$ReligiousAffiliation',
'$OtherPartnerships',
'$GenderAdmission',
'$TermType',
'$EntranceExam',
'$EntranceExamDate',
'$TotalEnrolled',
'$collegewebsite',
'$ContactInfo',
'$CampusLocations',
'$Certifications',
'$Diplomas',
'$AssociateDegrees',
'$MastersDegrees',
'$DoctorateDegrees',
'$SpecialDegreePrograms',
'$Accreditation',
'$CostofTuitionLocal',
'$CostofTuitionForeign',
'$Housing',
'$AcceptanceRate',
'$CoE',
'$CoD')") or die(mysql_error()) ;
if($ins)
{
echo "<br>".$Name."inserted";
$CollegeId = mysql_insert_id();
$text = trim($_POST['BachelorsDegrees']);
$textAr = explode("\n", $text);
foreach ($textAr as $BachelorsDegrees)
{
mysql_query("INSERT INTO Colleges_Courses (CollegeId, BachelorsDegrees)
VALUES (".(int)$CollegeId.", '".mysql_real_escape_string(trim($BachelorsDegrees))."')") or die(mysql_error()) ;
}
}
else
{
echo mysql_error();
}
If you wanted to use multiple inserts, updating each field in turn (which would be very slow and serves no useful purpose here), then you can insert multiple times with a column value and insert it if the row already exists. In this case assuming you have an auto increment id field:-
<?php
$Name = mysql_real_escape_string(trim($_POST['Name']));
$schoollogo = mysql_real_escape_string(trim($_POST['schoollogo']));
$Motto = mysql_real_escape_string(trim($_POST['Motto']));
$Description = mysql_real_escape_string(trim($_POST['Description']));
$Type = mysql_real_escape_string(trim($_POST['Type']));
$ReligiousAffiliation = mysql_real_escape_string(trim($_POST['ReligiousAffiliation']));
$OtherPartnerships = mysql_real_escape_string(trim($_POST['OtherPartnerships']));
$GenderAdmission = mysql_real_escape_string(trim($_POST['GenderAdmission']));
$TermType = mysql_real_escape_string(trim($_POST['TermType']));
$EntranceExam = mysql_real_escape_string(trim($_POST['EntranceExam']));
$EntranceExamDate = mysql_real_escape_string(trim($_POST['EntranceExamDate']));
$TotalEnrolled = mysql_real_escape_string(trim($_POST['TotalEnrolled']));
$collegewebsite = mysql_real_escape_string(trim($_POST['collegewebsite']));
$ContactInfo = mysql_real_escape_string(trim($_POST['ContactInfo',
$CampusLocations = mysql_real_escape_string(trim($_POST['CampusLocations']));
$Certifications = mysql_real_escape_string(trim($_POST['Certifications']));
$Diplomas = mysql_real_escape_string(trim($_POST['Diplomas']));
$AssociateDegrees = mysql_real_escape_string(trim($_POST['AssociateDegrees']));
$MastersDegrees = mysql_real_escape_string(trim($_POST['MastersDegrees']));
$DoctorateDegrees = mysql_real_escape_string(trim($_POST['DoctorateDegrees']));
$SpecialDegreePrograms = mysql_real_escape_string(trim($_POST['SpecialDegreePrograms']));
$Accreditation = mysql_real_escape_string(trim($_POST['Accreditation']));
$CostofTuitionLocal = mysql_real_escape_string(trim($_POST['CostofTuitionLocal']));
$CostofTuitionForeign = mysql_real_escape_string(trim($_POST['CostofTuitionForeign']));
$Housing = mysql_real_escape_string(trim($_POST['Housing']));
$AcceptanceRate = mysql_real_escape_string(trim($_POST['AcceptanceRate']));
$CoE = mysql_real_escape_string(trim($_POST['CoE']));
$CoD = mysql_real_escape_string(trim($_POST['CoD']));
$ins = mysql_query("INSERT INTO Colleges (Id, Name)
VALUES (NULL, '$Name')";
if($ins)
{
echo "<br>".$Name."inserted";
$CollegeId = mysql_insert_id();
$ins = mysql_query("INSERT INTO Colleges (Id, schoollogo)
VALUES (".(int)$CollegeId.", '$schoollogo') ON DUPLICATE KEY UPDATE schoollogo = VALUES(schoollogo)";
$ins = mysql_query("INSERT INTO Colleges (Id, Motto)
VALUES (".(int)$CollegeId.", '$Motto') ON DUPLICATE KEY UPDATE Motto = VALUES(Motto)";
$ins = mysql_query("INSERT INTO Colleges (Id, Description)
VALUES (".(int)$CollegeId.", '$Description') ON DUPLICATE KEY UPDATE Description = VALUES(Description)";
$ins = mysql_query("INSERT INTO Colleges (Id, Type)
VALUES (".(int)$CollegeId.", '$Type') ON DUPLICATE KEY UPDATE Type = VALUES(Type)";
//etc
$text = trim($_POST['BachelorsDegrees']);
$textAr = explode("\n", $text);
foreach ($textAr as $BachelorsDegrees)
{
mysql_query("INSERT INTO Colleges_Courses (CollegeId, BachelorsDegrees)
VALUES (".(int)$CollegeId.", '".mysql_real_escape_string(trim($BachelorsDegrees))."')") or die(mysql_error()) ;
}
}
else
{
echo mysql_error();
}
You can use multi-query to combine multiple sql queries into one single query.
Example with Multi-Query
$mysqli = new mysqli("example.com", "user", "password", "database");
$sql = "INSERT INTO table VALUES ('My First Table'); ";
$sql.= "INSERT INTO table VALUES ('My Second Table'); ";
$mysqli->multi_query($sql);
I have an array $members that contains some ID(maximum 6 in number) from the table users. Using the following code, I loop through each index of $members, search for the details and store them in another array.
foreach($members as $key=>$value){
$res = mysql_query("SELECT id,name,email FROM users WHERE id='$value'");
if ($res === false) {
echo mysql_error();
die;
}
$row = mysql_fetch_assoc($res);
if($row['id'])
{
$members_name[]=$row['name'];//array for name
}
}
Now I want to insert the ID & names that are stored in the array into another TABLE register in the following format:
(The left side are the rows in my TABLE register)
mem_0_id-->$members[0]
mem_0_name-->$members_name[0]
mem_1_id-->$members[1]
mem_1_name-->$members_name[1]
mem_2_id-->$members[2]
mem_2_name-->$members_name[2]
mem_3_id-->$members[3]
mem_3_name-->$members_name[3]
mem_4_id-->$members[4]
mem_4_name-->$members_name[4]
How can I insert in this way? using just a single INSERT statement?
haven't tried this, but here is my answer anyway :)
$query = "INSERT INTO register(id, name) VALUES ($members[0], $members_name[0])";
for($i=1; $i<count($members); $i++)
{
$query .= ", ($members[$i], $members_name[$i])";
}
then try to execute the query..
Do you do anything else with the array, or are you just retrieving it from one table in order to insert it into another?
If so then you can do the whole thing like this.
$memberIds = implode(',', $members); // comma separated list of member ids
$query = "insert into register (id, name) select id, name from users where id in ($memberIds)";
mysql_query($query); // this will select and insert in one go
If you do need to keep the array in memory, then it's still a good idea to get it all out at once
$memberIds = implode(',', $members); // comma separated list of member ids
$query = "select id, name from users where id in ($memberIds)";
$res = mysql_query($query);
while ($row = mysql_fetch_assoc($res)) {
$memberData[] = $row;
}
That's because running a query inside a loop is very bad for performance. Every time you run a query there is an overhead, so getting all the data at once means you pay this overhead once rather than multiple times.
Then you can build a statement to insert multiple rows:
$sql = "insert into register (id, name) values ";
$sql .= "(" . $memberData[0]['id'] . "," . $memberData[0]['name'] . ")";
for($i = 1; $i < count($memberData); $i++) {
$sql .= ",(" . $memberData[$i]['id'] . ",'" . $memberData[$i]['name'] . "')";
}
mysql_query($sql);
It's a bit nasty because of the commas and quotes but if I've done it correctly then if you do
echo $sql;
you should get something like
insert into register (id, name) values (1, 'john'), (2, 'jane'), (3, 'alice');
You can see that the first way, where you select and insert in one statment, is a lot nicer and easier so if you don't do anything else with the array then I highly recommend doing it that way.
I generated a random monster team from a table, and limited by 6. Now, I also want to insert the team into user_team which contains the fields
m1,m2,m3,m4,m5,m6
Those represent Monster 1 to Monster 6. Now when I try to insert the generated monsters into the team, only the last Monster seems to be inserting into it while I all of my monsters to be inserted.
http://prntscr.com/8zrj2
$sql = "SELECT * from monsterdata ORDER BY RAND() LIMIT 6";
$result = mysql_query($sql);
// this checks if you have a result
if ($result == null) echo "No result";
else {
while (($row = mysql_fetch_array($result)) != false) {
$row = mysql_fetch_array($result);
{
// html code here
}
}
the Insert statement is
$monster = $row['id'];
$sql = "INSERT into user_team(m1,m2,m3,m4,m5,m6) VALUES('$monster','$monster','$monster','$monster','$monster','$monster')";
$result = mysql_query($sql);
Just don't know where/how to place it so it inserts the right values into the right columns.
If it were me, I would push the ids into an array and then use that like so:
$monsterIds = array();
while(($row = mysql_fetch_array($result)) !== false) {
$monsterIds[] = $row['id'];
}
mysql_query("INSERT INTO user_team (m1, m2, m3, m4, m5, m6) VALUES ('{$monsterIds[0]}', '{$monsterIds[2]}', '{$monsterIds[3]}', '{$monsterIds[4]}', '{$monsterIds[5]}')") or die(mysql_error());
Also, don't forget to use the triple equals when comparing row results so that you don't get caught by a weird bug where things evaluate to false that aren't actually false (=== is the way to go with many functions which might return either an array, integer, or a boolean depending on the outcome).
The values will be placed in the columns in the order they are supplied.
Here is my example using PDO (php library):
$DBH = new PDO("mysql:host=$db_host;dbname=$db_name", $username, $password);
$webContractList=$DBH->query('SELECT id,nume,data FROM user2')->fetchAll();
$STH=$DBH->prepare("INSERT INTO user (id,nume,data) VALUES (:id ,:nume , :data)");
foreach ($webContractList as $item){
$STH->execute(array(':id'=>$item['id'],
':nume'=>$item['nume'],
':data'=>date('Y-m-d',strtotime($item['data']))));
}
I have an array that grabs checkbox data and posts certain information into the database if the checkbox data isn't a copy of something already in the database. What I would like to know is how can I create a code that scans through the database and finds data that wasn't part of my checkbox data and delete it from the database.
Okay, for example let's say I have values 1,2,3,4 in my database, but in my checkboxes I only get back 1,2,4. I would like a code that scans my database and deletes that value(s) (in this case 3) from the database.
Here is my current code:
foreach($_POST['publish'] as $index => $val){
$matches = mysql_query("SELECT * FROM `$blog_table` WHERE `postID` = '$val");
if (mysql_num_rows($matches) > 0)
{
// do nothing
} else {
$query3 = "insert into `$blog_table`
(`postID`)values
('$val')";
mysql_query($query3);
}
}
Here would be the code I would use with escaped input
if (!empty($_POST['publish']))
{
$inserts = array();
$deletes = array();
foreach ($_POST['publish'] as $val)
{
$deletes[] = intval($val);
$inserts[] = '('.intval($val).')';
}
$delete = "DELETE FROM `".$blog_table."` WHERE postID NOT IN (".implode(',',$deletes).");";
$insert = "INSERT INTO `".$blog_table."` (`postID`) VALUES ".implode(',',$inserts)."";
}
you should use query like this:
delete from table where id NOT in (3)
in php like:
$query = "DELETE FROM `$blog_table` WHERE `postID` NOT IN (" . implode(',', $array) . ")";
For the MySQL query, you can use NOT IN:
DELETE FROM tablename
WHERE col1 NOT IN (1, 2, 4)