i have scan_freq column in dr_scan table.
I am trying to insert records to the dr_scan table and if there is any duplicate value, it will change the duplicate row scan_freq column to 0 otherwise it stays 1.
so I developed the below-noted code and it worked as I expected.
But when I try to insert multiple records at once with duplicate values it will return " subquery returns more than 1 row when insert multiple records at once"
if ($savec == "confirm")
{
$checkIfExistsQuery = "SELECT COUNT(*) as count FROM dr_scan WHERE barcode = (SELECT barcode FROM temp_scan_save WHERE user_id='$user_id' )";
$checkResult = mysqli_query($conn, $checkIfExistsQuery);
$rowCount = mysqli_fetch_assoc($checkResult)['count'];
if ($rowCount > 0)
{
$updateSql = "UPDATE dr_scan SET scan_freq = 0 WHERE barcode = (SELECT barcode FROM temp_scan_save WHERE user_id='$user_id' )";
$updateResult = mysqli_query($conn, $updateSql);
}
$insertSql = "INSERT INTO dr_scan (barcode, machine_type, line, date, user_id, device_id, center, mstatus, mstatus_changed, live_status, transfer_status, scan_freq) SELECT barcode, machine_type, line, date, user_id, device_id, center, mstatus, mstatus_changed, live_status, transfer_status, 1 as scan_frequency FROM temp_scan_save WHERE user_id='$user_id'";
$insertResult = mysqli_query($conn, $insertSql);
if (isset($updateResult) && $updateResult && isset($insertResult) && $insertResult)
{ $response = array("response" => "success"); echo json_encode($response);
} else
{
$response = array("response" => "failure"); echo json_encode($response);
}
$sql2 = "DELETE FROM temp_scan_save WHERE user_id='$user_id' "; $result2 = mysqli_query($conn, $sql2); }
else { }
mysqli_close($conn);
2
Answers
you’re encountering a problem because the subquery (SELECT barcode FROM temp_scan_save WHERE user_id=’$user_id’) is returning more than one row, and your code is not handling that situation correctly. To resolve this issue, you can modify your SQL queries to handle multiple rows in the subquery.
Assuming
barcode
is a unique key indr_scan
, you can use one IODKU and one DELETE statement. You should be using prepared statements instead of concatenating strings together.