display related records from my database using php - php

i want to display record related to a specific primary key based on the foreign keys in other tables. How to display records for that primary key in other tables using php??
for example:
table1
primary key 1: plate#1
primary key 2: plate#2
primary key 3: plate#3
table2
primary key 1: destination|route|revenue|plate# 1
primary key 2: destination|route|revenue|plate# 3
table3
primary key 1: diesel price|number of liters|plate# 1
primary key 2: diesel price|number of liters|plate# 3
I already created a page that will display all the data in table1. I want to display the data in table1 and table2 that are related to the data in table1 when I made the database they already had relationship with each other. My problem is just displaying the record related to table1. I want to display records for just plate#1, another for plate#2 and so on.

Here's a crude example:
<?php
$truck_id = mysql_real_escape_string($_GET['truck_id']);
$sql_PK = "SELECT * FROM table1 WHERE id = '{$truck_id}'";
$res_PK = mysql_query($sql_PK);
$row_PK = mysql_fetch_assoc($res_PK);
$truck_plate = $row_PK['plate'];
$truck_plate = mysql_real_escape_string($truck_plate);
$sql = "SELECT table2.plate, table2.destination, table2.route, table3.plate, table3.diesel_price, table3.num_of_liters FROM table2, table3 WHERE table2.plate = table3.plate AND table2.plate = '{$truck_plate}'";
$res = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($res);
// this will give you the details from the following
//TABLE2
// plate
// destination
// route
//TABLE3
// plate
// diesel_price
// num_of_liters
?>
There's a couple of important things to remember. First is get in the habit of naming your fields without spaces in the database and use _ instead. so diesel price is diesel_price, etc. Secondly is to make sure that you are protecting yourself from any injections like I have shown here using the mysql_real_escape_string
So when someone clicks on truckdetails.php?plate=mrtchi it's going to query the database based on the plate number: mrtchi

You are probably looking to join tables to get the final results. Join allows you to essentially merge tables together and get a single result based on the selections. Google php mysql join table and look at some of the examples. Here's one for you: Join Tables

Related

Showing all results also when not present in 2nd optional database

An explaination of how my code works:
I have a pure select on a database that is filled through a different program. I am selecting data to check up on orders. Now I want to give a ready status to the order, which cannot be inserted into the database I am selecting from, so I created a small different database to insert the ordernumber (from the previous selection) into that database and insert a 1. This can be updated to a 0 by pressing the button again.
Now I want to show my orders as the following:
An order can have the status, but doesn't have to have a status.
If it doesnt have a status it should show in the list.
With my current code (below) it only shows orders that are present in the 2nd optional database, I understand why this is happening. But I can't manage to work out a solution to show everything even if an ordernumber is not present in the 2nd optional database.
while( $row = sqlsrv_fetch_array( $stmt1, SQLSRV_FETCH_ASSOC) ) {
$statusorder = $row['ordernr']; //Ordernumber selected in primary database
$sqlstatus = "SELECT status from status WHERE Ordernr = '$statusorder'"; //selecting the status from optional database
$result = $conn2->query($sqlstatus);
while($row2 = $result->fetch_assoc()) {
<insertmyhtmlhere>
}
}
You can use only one query to get all data. Just use database.Table.column
This will display all order id of table database1.ordersTable
SELECT db1.id FROM database1.`ordersTable` db1
This will display all status of table database2.statusTable
SELECT db2.status FROM database2.`statusTable` db2
Now just combine with LEFT JOIN to show all rows whether it exists or not.
SELECT db1.id, db2.`status`
FROM database1.`ordersTable` db1
LEFT JOIN database2.`statusTable` db2
ON db1.`id` = db2.`status`;
DonĀ“t forget to use Condition to filter, in this case, the same order id.
ON db1.`id` = db2.`status`;
If databases haves different COLLATION you can use this:
SELECT db1.`id', db2.`status`
FROM database1.`ordersTable` COLLATE utf8mb4_spanish_ci db1
LEFT JOIN database2.`statusTable` COLLATE utf8mb4_spanish_ci db2
ON db1.`id` = db2.`status`;
Here are a sample fiddle

MySql Duplicate entries with auto updating context sensitive relations in PHP

Is there any possibility to duplicate specific entries by auto updating context sensitive relations?
Given a table 'table1' like:
My goal is to duplicate all entries with categoryId 42 while updating parentId if neccessary:
id is an auto incremented column and parentId is used to identify relations between the entries.
Currently I'm inserting them one by one, selecting the old data and managing the logic for the parentId in PHP.
//Thats simplified what I do ($conn is a Zend_Db_Adapter_Abstract)
$rows = $conn->fetchAll("SELECT * FROM table1 WHERE categoryId = 42 ORDER BY parentId ASC");
$newIds = [];
foreach($rows as $row){
if(array_key_exists($row['parentId'],$newIds))
$row['parentId'] = $newIds[$row['parentId']];
else
$row['parentId'] = null;
$conn->query("INSERT INTO table1 (parentId,info,categoryId) VALUES (?,?,?)",[$row['parentId'],$row['info'],$row['categoryId']]);
$newId = $conn->lastInsertId('table1');
$newIds[$row['id']] = $newId;
}
I'm stuck with this because I need the lastInsertedId of the new element to set the new parentId for the next one.
But I'm experiencing this to be pretty slow (in relation to one single query which contains the logic).
Is there any possibility to give a query some kind of incremental element sensitive logic? Or have you any suggestions on how to fasten this up?
Any help appreciated! :)
You are not showing any code. I guess you use mysqli_insert_id() to get the last inserted ID. Maybe you can do something with MAX(ID)+1.
Something like:
INSERT INTO table1
SELECT MAX(ID)+1,
info,
categoryId
FROM
table1
WHERE .............. -- the conditions to retreive the parent

Add data to existing data in MySQL Database

I have a table called tblActivities. There are two fields ID and Attendees.
ID Attendees
1 Jon Jhonson
2 Ive Iveson
Which PHP function or MySQL statement do I need to use to get to this result:
ID Attendees
1 Jon Jhonson, Ive Iveson, Adam Adamer
2 Ive Iveson
In other words, how can I add new data to existing data in my database?
You need something like:
UPDATE tblActivities
SET Attendees = CONCAT(Attendees, "Ive Iveson, Adam Adamer")
WHERE id = 1;
But maybe you should change the database layout. It is preferable to have only one value in one field. You could find more information under http://en.wikipedia.org/wiki/Database_normalization.
use mysql's update statement. If you want to exeute through php then
first get the existing value using select statement,
SELECT Attendees from <table-name> WHERE ID = 1
you will get attendees existing value, put it in a php variable, now concatenate your value..
and then update,
UPDATE <table_name>
SET Attendees=<new-value>
WHERE ID=1
you would have to use the php's mysql functions to run the above queries
I think you're better off restructuring. Make a table:
ID (primary key)
ACTIVITY_ID (foreign key to activity table)
ATTENDEE (foreign key to USERS table)
Then select everything from that event and concat in PHP.
$q = mysql_query( 'SELECT ATTENDEE FROM tblActivities '.
'WHERE ACTIVITY_ID = $activity_id' );
$attendees = array();
while( $row = mysql_fetch_assoc( $q ) )
{
$attendees[] = $row['attendee'];
}
$attendees =implode( ' ', $attendees );

PHP/ MYSQL Inserting Data Into Multiple Tables

I am trying to add data into 3 table using PHP, atm I can only view the results of the tables that are joined .
RESULTS QUERY
$sql = mysql_query("SELECT PART_ID, PART_DESC, SERIAL_NUM, PART.RACK_NUM, PART.PART_TYPE_ID, PART_TYPE_DESC, LOCATION
FROM PART
INNER JOIN PART_TYPE ON PART.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID
INNER JOIN RACK ON RACK.RACK_NUM = PART.RACK_NUM
This will get all the rows from the PART table, and for each of the rows we find, match that row to a row in the PART_TYPE table (the condition being that they have the same PART_TYPE_ID). If no match between the PART and PART_TYPE tables can be found for a given row in the PART table, that row will not be included in the result.
My Insert Query This is where im having trouble
How do I add the data to the PART_ID, PART_TYPE and RACK tables?
<?php
// Parse the form data and add inventory item to the system
if (isset($_POST['PART_ID'])) {
$id = mysql_real_escape_string($_POST['PART_ID']);
$PART_DESC = mysql_real_escape_string($_POST['PART_DESC']);
$SERIAL_NUM = mysql_real_escape_string($_POST['SERIAL_NUM']);
$RACK_NUM = mysql_real_escape_string($_POST['RACK_NUM']);
$PART_TYPE_ID = mysql_real_escape_string($_POST['PART_TYPE_ID']);
$LOCATION = mysql_real_escape_string($_POST['LOCATION']);
$PART_TYPE_DESC = mysql_real_escape_string($_POST['PART_TYPE_DESC']);
// See if that product name is an identical match to another product in the system
$sql = mysql_query("SELECT PART_ID FROM PART WHERE PART_ID='$id' LIMIT 1");
$productMatch = mysql_num_rows($sql); // count the output amount
if ($productMatch > 0) {
echo 'Sorry you tried to place a duplicate "Product Name" into the system, click here';
exit();
}
// Add this product into the database now
**$sql = mysql_query("INSERT INTO PART (PART_ID, PART_DESC, SERIAL_NUM, RACK_NUM, PART_TYPE_ID)
VALUES('$id','$PART_DESC','$SERIAL_NUM','$RACK_NUM','$PART_TYPE_ID')") or die (mysql_error());**
header("location: inventory_list.php");
exit();
}
?>
Micheal if I understood your problem you just need to do 2 other SQL INSERT to add data in the other table
$sql = mysql_query("INSERT INTO PART (PART_ID, PART_DESC, SERIAL_NUM, RACK_NUM, PART_TYPE_ID)
VALUES('$id','$PART_DESC','$SERIAL_NUM','$RACK_NUM','$PART_TYPE_ID')") or die (mysql_error());
$currentID = mysql_inserted_id();
$sql2 = mysql_query("INSERT INTO PART_TYPE [..]");
$sql3 = mysql_query("INSERT INTO RACK [..]");
You can use $currentID if you need the ID of the last record inersted into PART
But still I strongly suggest you to learn PDO http://php.net/pdo for sql
your table management is wrong, you never use arrows just to show that you are joining it with that table from this table, but rather from the key in first table to foreign key in the second table, that's what i would start from, maybe a better idea would be to join them using JOIN look up in google how joins are working, that may be the cause...
I agree with #yes123, that is the correct way to insert into tables, if you have a program called heidisql then use it, because there is a window to run your queries... that way to test if it is properly written also use mysql_error.
Debug, debug, and one more time debug your code.
Your tables are not correctly designed.
Try this table structures .
In your base table Part. -
The columns in this should be:
Part_id
part_desc
serial_num
The part_type should have following columns:
part_type_id
part_type_desc
part_id -> foreign key to the parent table
The rack table should be:
Rack_num
location
part_id -> foreign key to the parent table.
So your select query to get all the part related information would be:
$sql="select * from part join part_type pt on tp.part_id=part.part_id join Rack_num rn on rn.part_id=part.part_id";
With this structure the data remains normalized. And is flexible, so if the parts are on multiple racks you just go to the rack table and add and new rack number and the part id.

how to extract mysql data into json using php

i have retrieved mysql data from one table in json using the following script
$table_first = 'abc';
$query = "SELECT * FROM $table_first";
$resouter = mysql_query($query, $conn);
$set = array();
$total_records = mysql_numrows($resouter);
if($total_records >= 1){
while ($link = mysql_fetch_array($resouter, MYSQL_ASSOC)){
$set[] = $link;
}
}
echo json_encode($set);
how can i retrieved data from two other tables in which there is a foreign key of this table in both of those tables. OR simply how can i retrieved data from 3 mysql tables in php.
I believe the best way to go here is using a JOIN or just something like this:
$sql = "SELECT
tabl1.*, table2.*, tabl3.* FROM table1, table2, table3
WHERE
table1.fk1 = table2.id AND
table1.fk2 = table2.id";
//Do the whole selection process...
If you make the queries separately, you'll be forcing 3 queries onto your database and will end in a performance hit that you dont need. So, the idea is load all the data from the DB using joins or similar that and then encode the results. Is faster and you'll leave the merging work to MySQL
Hope I can help
You can get all data firstly.
Then merge the data array.
Finally use json_encode to change the data format.
There is a foreign key of this table in both so you can use "join" to retrieve values from other tables.
Suppose that there are two tables as State(st_id,st_name) and City(ct_id,ct_name,state_id). Now, primary key are st_id & ct_id respectively of tables State & City.
Connection between this two table can be establish by joining State.st_id and City.state_id.
Now, coming to your problem to retrieve data from two table State & City, we can make sql query like following,
$sql="select s.*, c.* from State s, City c
where s.st_id=c.state_id ";
Using above query you can fetch data from database and convert into json format and can send it to android system. here is a good article http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/. i hope you like it.
I believe your code roughly will look like this:
$query = "SELECT
A.column1 AS First_1
A.column2 AS First_2
B.column2 AS Second
C.column3 AS Third
FROM table1 A, table2 B, table3 C
WHERE
A.fk1 = B.id AND
B.fk2 = C.id";
where a column is a relevant record you want to show. Meanwhile,
AS will act as a key name in JSON.

Categories