par
ynx » 08 févr. 2016, 15:51
Salut,
Voici un début d'optimisation possible (code non testé) :
// tableau d'exemple de données reçus
$datasent = array(
array('link' => 'http://google.fr/', 'aTime' => '123456789'),
array('link' => 'http://google.com/', 'aTime' => '123456789'),
array('link' => 'http://google.uk/', 'aTime' => '123456789'),
array('link' => 'http://google.ca/', 'aTime' => '123456789'),
array('link' => 'http://google.us/', 'aTime' => '123456789'),
array('link' => 'http://google.ru/', 'aTime' => '123456789')
);
// on regroupe les liens envoyés dans un tableau
$datasentLinks = array();
foreach ($datasent as $data) {
$datasentLinks[] = mysqli_escape_string($db, $data['link']); // on évite les injections sql
}
// on récupère tous les liens envoyés qui existent déjà en bdd
$sqlverif = "SELECT idlink FROM user_link WHERE idlink IN ('" . implode("','", $datasentLinks) . "')";
$query = mysqli_query($db,$sqlverif) or die('ERROR SQL !'.mysqli_error($db));
$existedLinks = mysqli_fetch_all($query);
// on initialise la chaine qui va contenir la liste des entrées sql (VALUES)
$insertValues = '';
foreach ($datasent as $data) {
// si le lien n'est pas dans la bdd
if (!in_array($data['link'], $existedLinks) {
// si pas déjà ds la bdd insertion des donnees ds la base
// on ajoute une virgule en fin de ligne pour ajouter d'autres entrées
$insertValues = '("", "' . mysqli_escape_string($db,$id) . '", "' . mysqli_escape_string($db,$data['link']).'", "'.mysqli_escape_string($db,$data['aTime']).'", vis),';
}
}
// si on a au moins un lien à ajouter
if ($insertValues) {
// on supprime la dernière virgule ajoutée à la fin
$insertValues = substr($insertValues, 0, strlen($insertValues) - 1);
$sqlInsert = 'INSERT INTO user_link VALUES ' . $insertValues;
mysqli_query($db,$sql) or die('ERROR SQL !'.mysqli_error($db));
}
L'idée est de récupérer dans la variable $existedLinks l'ensemble des liens qui existent déjà dans la base de données en utilisant l'opérateur IN en sql.
Puis on parcours le tableau des données reçues en vérifiant l'existence en bdd via if(!in_array($data['link'], $existedLinks)
Enfin on concatène toutes les valeurs des données à insérer pour n'avoir qu'une seule requête sous la forme suivante :
INSERT INTO user_link VALUES
("", "id1", "link1", "time1", vis),
("", "id2", "link2", "time2", vis),
("", "id3", "link3", "time3", vis)
Par contre je n'ai pas compris d'où venait la variable $id dans ton code ni pourquoi elle est utilisée dans la requête de vérification.
Bonne journée
Salut,
Voici un début d'optimisation possible (code non testé) :
[php]// tableau d'exemple de données reçus
$datasent = array(
array('link' => 'http://google.fr/', 'aTime' => '123456789'),
array('link' => 'http://google.com/', 'aTime' => '123456789'),
array('link' => 'http://google.uk/', 'aTime' => '123456789'),
array('link' => 'http://google.ca/', 'aTime' => '123456789'),
array('link' => 'http://google.us/', 'aTime' => '123456789'),
array('link' => 'http://google.ru/', 'aTime' => '123456789')
);
// on regroupe les liens envoyés dans un tableau
$datasentLinks = array();
foreach ($datasent as $data) {
$datasentLinks[] = mysqli_escape_string($db, $data['link']); // on évite les injections sql
}
// on récupère tous les liens envoyés qui existent déjà en bdd
$sqlverif = "SELECT idlink FROM user_link WHERE idlink IN ('" . implode("','", $datasentLinks) . "')";
$query = mysqli_query($db,$sqlverif) or die('ERROR SQL !'.mysqli_error($db));
$existedLinks = mysqli_fetch_all($query);
// on initialise la chaine qui va contenir la liste des entrées sql (VALUES)
$insertValues = '';
foreach ($datasent as $data) {
// si le lien n'est pas dans la bdd
if (!in_array($data['link'], $existedLinks) {
// si pas déjà ds la bdd insertion des donnees ds la base
// on ajoute une virgule en fin de ligne pour ajouter d'autres entrées
$insertValues = '("", "' . mysqli_escape_string($db,$id) . '", "' . mysqli_escape_string($db,$data['link']).'", "'.mysqli_escape_string($db,$data['aTime']).'", vis),';
}
}
// si on a au moins un lien à ajouter
if ($insertValues) {
// on supprime la dernière virgule ajoutée à la fin
$insertValues = substr($insertValues, 0, strlen($insertValues) - 1);
$sqlInsert = 'INSERT INTO user_link VALUES ' . $insertValues;
mysqli_query($db,$sql) or die('ERROR SQL !'.mysqli_error($db));
}[/php]
L'idée est de récupérer dans la variable $existedLinks l'ensemble des liens qui existent déjà dans la base de données en utilisant l'opérateur IN en sql.
Puis on parcours le tableau des données reçues en vérifiant l'existence en bdd via if(!in_array($data['link'], $existedLinks)
Enfin on concatène toutes les valeurs des données à insérer pour n'avoir qu'une seule requête sous la forme suivante :
[sql]INSERT INTO user_link VALUES
("", "id1", "link1", "time1", vis),
("", "id2", "link2", "time2", vis),
("", "id3", "link3", "time3", vis)[/sql]
Par contre je n'ai pas compris d'où venait la variable $id dans ton code ni pourquoi elle est utilisée dans la requête de vérification.
Bonne journée