Ik wil de complete inhoud van een array in de database zetten. Kan ik hier het best gewoon een foreach voor gebruiken, of zijn hier nog andere oplossingen voor.
Gewoon met een foreach inderdaad. Je zult toch op een of andere manier door die array heen moeten lopen en voor elke nieuwe waarde een nieuwe insertquery uit moeten voeren ;-)
INSERT statements that use VALUES syntax can insert multiple rows. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas. Example:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Bedenk ook op welke manier je de foutafhandeling gaat aanpakken. Wat moet er gebeuren als er ergens iets fout gaat? Moet de rest van de array wel in de database worden gezet of moet alles ongedaan worden gemaakt? Wellicht wil je een TRANSACTION gebruiken, dan heb je innoDB nodig. (is toch al de beste MySQL-engine!)
Ik heb deze methode nooit toegepast en heb dus geen idee wat er gebeurd als er ergens iets fout gaat. Ik verwacht dat de hele query mislukt, maar met MySQL weet je het maar nooit... Test dit even heel goed om zekerheid te krijgen.
htmlentities() en consorten gebruik je bij het aanmaken van html-output. Nooit bij een INSERT. Kijk eens naar htmlspecialchars()
Nogmaals de vraag 'wat te doen bij een fout', wat ga je doen met de reeds uitgevoerde INSERT-queries (binnen de foreach), wanneer een query mislukt? Weet je 110% zeker dat de data-integriteit van de database niet in het geding is? Alle systemen die ik ken (en dat zijn er nogal wat) maken alle INSERT-queries ongedaan die je op dat moment aan het uitvoeren was. Het heeft geen zin om bv. een user aan te maken en maar de helft van zijn hobbies in de database weg te schrijven. Een halve aanmelding heb je weinig aan.
Dan ben je waarschijnlijk op zoek naar de functie [php]urlencode[/php](). Maar ik snap niet waarom je die zou willen gebruiken bij het invoeren inde database.
gaat niet over het in de database zetten Blanche, was gewoon een andere vraag. Dat had ik wel nodig voor dit systeem, maar had niks met de database te maken ;-)
Bedenk ook op welke manier je de foutafhandeling gaat aanpakken. Wat moet er gebeuren als er ergens iets fout gaat? Moet de rest van de array wel in de database worden gezet of moet alles ongedaan worden gemaakt? Wellicht wil je een TRANSACTION gebruiken, dan heb je innoDB nodig. (is toch al de beste MySQL-engine!)
@Frank
Dit vond ik wel even interessant.
Hoe pas je dit toe?
Zoiets? (ongetest):
<?php
require "connect.php";
$trans=mysql_query ($query1="START TRANSACTION") or die ('Error: ' . mysql_error());
$insert=mysql_query ($query2="INSERT INTO table SET data1='$_POST[data1]', data2='$_POST[data2]'");
if (mysql_error()) {
$rollback=mysql_query ($query3="ROLLBACK") or die ('Error: ' . mysql_error());
die ('Error: ' . mysql_error());
}
$commit=mysql_query ($query4="COMMIT") or die ('Error: ' . mysql_error());
mysql_close($link);
?>
@Wim: Het zal volgens mij wel werken, maar is niet netjes gescript. Verder heb je in jouw voorbeeld helemaal niets aan een TRANSACTION, je voert tenslotte maar 1 INSERT-query uit. Wanneer deze mislukt, dan is er niets in de database weggeschreven en valt er dus ook niets te ROLLBACK-en.
Dit voorbeeld zit beter in elkaar:
<?php
require "connect.php";
$query = "START TRANSACTION";
$result = mysql_query($query) or die('Error: '.mysql_error()); // die() is vies!
$aInput = array('aap', 'noot', 'mies');
$iError = 0;
foreach ($aInput as $value) {
$query = "INSERT INTO tabelnaam (kolomnaam) VALUES('".$value."')";
$result = mysql_query($query);
if (!$result) { // query is mislukt
$iError++;
}
}
if ($iError == 0) { // geen fouten opgetreden
$query = "COMMIT";
}
else { // ergens is er iets fout gegaan.
$query = "ROLLBACK";
}
// COMMIT of ROLLBACK uitvoeren:
$result = mysql_query($query) or die(mysql_error()); // die() is vies!
?>
Hier worden 3 queries uitgevoerd, wanneer er 1 of meerdere mislukken, worden ze allemaal ongedaan gemaakt.