I have two below tables
1)CandidateDetails
EmployeeId FirstName LastName Mobile Email BatchId
1 fn1 ln1 123456789 Email1 75
2 fn2 ln2 123456790 Email2 75
3 fn3 ln3 123456791 Email3 75
4 fn4 ln4 123456792 Email4 75
2)DuplicateCandidate
EmployeeId FirstName LastName Mobile Email BatchId
My requirement is if EmployeeId is already available in CandidateDetails table then duplicate record to insert into DuplicateCandidate
Below is PHP script only for inserting array to CandidateDetails table, but i am not able to check the condition for if employee id is duplication then that record to insert into another DuplicateCandidate table.
<?php
header("Access-Control-Allow-Origin: http://localhost:4200");
header("Access-Control-Allow-Credentials: true ");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header("Access-Control-Allow-Headers: X-Custom-Header, Origin, Content-Type , Authorisation , X-Requested-With");
header("Content-Type: application/json; charset=UTF-8 ");
$json = file_get_contents('php://input');
$decoded = json_decode($json, true);
print_r($decoded);
$id=$_GET['id'];
function conn() {
$dbhost = "xxxx";
$user = "xxx";
$pass = "xxx";
$db = "xxxx";
$conn = new PDO('mysql:host=xxx;dbname=xxx', $user, $pass);
return $conn;
}
$db = conn();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$p = $db->prepare("INSERT INTO CandidateDetails(EmployeeId, FirstName, LastName, Mobile,Email,BatchId)VALUES(:EmployeeId,:FirstName,:LastName,:Mobile,:Email,'$id')");
foreach ($decoded as $item) {
$p->execute($item);
}
echo json_encode(true);
?>
2
Answers
While the accepted answer may do the job, it has several SQL injection vulnerabilities, including
$_GET['id']
(which should not be trusted – a malicious actor could put anything in here including a SQL command to clear your database), and the JSON harvested fromphp://input
(likewise – even if it’s valid JSON you could hide commands to delete data in here). Parameter escaping (as your original example) is the way to go.I’ve used position parameter escaping (
?
) which should also work with MySQL. Named position escaping (:id
) is probably better, but doesn’t allow me to quickly generate all parameters (build the$params
string), and the database I tested against doesn’t support them.After separating the components into functions (as I’ve done), you’ll notice we have a bit of a grouping of functions beginning with
db_
… you might, instead, configure bundling these into a class. At that point you could avoid passing$db
as the first parameter because you could internally share that in the class. But that’s a completely different topic and out of scope of your original question.