$vid = 1000;
$title = 'test';
function checkvid($vid) {
global $pdo;
$stmt = $pdo->prepare("select 1 from lista where vid=?");
$stmt->execute([$vid]);
return $stmt->fetchColumn();
}
if (!checkvid($vid)):
$sql = "insert into lista (title,vid) values (?,?)";
$pdo->prepare($sql)->execute([$title, $vid]);
else:
// exista deja...
endif;
Problema este că dacă rulez acest cod repetitiv în mai puțin de o secundă, să zic așa, item-ul se adaugă în bază de mai multe ori chiar dacă am acea verificare…
function checkvid($vid) {
global $pdo;
$stmt = $pdo->prepare("select 1 from lista where vid=:vid");
$stmt->bindParam(':vid', $vid);
$stmt->execute();
return $stmt->fetchColumn();
}
Hai să punem altfel problema: ce vrei să faci mai exact din codul ăsta? Abordarea ta, din capul locului, s-ar putea să aibă nevoie de îmbunătățiri. Există o mulțime de variante prin care se evită duplicatele: constrângere pe vid, selectarea vid-ului maxim și apoi incrementarea lui cu 1 de fiecare data când inserezi ceva (care e de fapt logica constrainutului), sau chiar soluții mai complicate care merită folosite numai dacă arhitectura aplicației nu permite altfel.
Nu am înțeles nici faza cu o secundă. În mai mult de o secundă nu îți creează duplicate? De unde ai luat acea secundă?
Plecand de la codul tau intial poti sa verifici cate randuri returneaza statement-ul tau.
$stmt->rowCount()
function vidAlreadyExists($vid) {
global $pdo;
$stmt = $pdo->prepare("select 1 from lista where vid=:vid");
$stmt->bindParam(':vid', $vid);
$stmt->execute();
return $stmt->rowCount() != 0
}
if (!vidAlreadyExists($vid)):
$sql = "insert into lista (title,vid) values (?,?)";
$pdo->prepare($sql)->execute([$title, $vid]);
else:
// exista deja...
endif;
Din testele interne am performanta mult mai buna si consistenta doar aducand informatiile din baza de date (eventual punand GROUP BY/ORDER BY) si procesand in PHP decat lasand logica pe seama bazei de date.
Este ceva gresit aici. Daca exista deja de ce vrei sa ii dai altul? Daca incerci sa calculezi id-ul in php in general vei avea probleme. Fara un context nu avem cum sa oferim solutia.
PHP-ul nu poate garanta că un tabel nu va conține duplicate, oricâte verificări ai face. Ai nevoie, obligatoriu, de o coloană unică (ți-a răspuns Răzvan mai sus).
Edit: Poți să verifici cu php. Poți folosi “INSERT IGNORE” care va returna 1 dacă rândul a fost inserat și 0 dacă nu a fost inserat. Cam așa ar trebui să ai:
<?php
$vid = 1000;
$title = 'test';
$sql = "insert ignore into lista (title,vid) values (?,?)";
$pdo->prepare($sql)->execute([$title, $vid]);
if($pdo->rowCount() === 1)
{
// a fost inserat acum...
}
else
{
// exista deja...
}