Ik ben nog steeds bezig met een scriptje.
Deze moet informatie posten in de database van Albums/Single's.
Deze worden over 2 db table verdeelt 1. albums en 2. album_track en zijn gekoppelt met foreign key.

Dit werkt opzich helemaal na behoren en in album_track word ook de album_id mee gepost.
Als ik 1 nieuwe album post met 1 track werkt dit goed.

Omdat ik voor de tracks een js file heb waardoor ik met een + en - button extra input velden kan maken zodat ik meerdere tracks kan toevoegen als hier behoefde voor is. Het maken van extra velden werkt ook goed en zonder problemen. Alleen zodra ik dus een album toe wil voegen met 2 tracks dan post hij in de database:

In albums: id - artiest - titel enzz
In album_track: id - album_id track_nr - track
En dat 2x met als gevolg dat ik 2 albums heb met elk 1 track. Dit had meoten zijn 1 album met 2 tracks.

Tevens maak ik gebruik van formulier afhandeling om te kijken of er fouten zijn of de velden wel zijn ingevult.
Als ik 1 track niet in vul krijg ik netjes daar een melding van maar de input veld word niet rood aangegeven.
Dit word wel gedaan bij de overige velden in het formulier.

Wie kan mij opweg helpen bij deze 2 problemen.
Enige surgesties voor een andere multi input mag ook als dit makelijke kan.

Hier onder mijn insert.php en het stukje van de track input velden.

insert.php
<?php
// Er word iets gepost met het Formulier.
// We gaan de gegevens ophalen en daarna kijken of alles klopt.
if ( $_SERVER['REQUEST_METHOD'] == 'POST' &&
isset($_POST['artiest'], $_POST['titel'], $_POST['bericht'], $_POST['youtube'], $_POST['type'], $_POST['track_nr'.$i], $_POST['track'.$i]) )
{

// We gaan de errors in een array bijhouden
$aErrors = array();

// Een Album/Single Artiest naam heeft letters, spaties en misschien een apostrof of koppelteken
// maar niet alleen spaties
if ( !isset($_POST['artiest']) or !preg_match( '~^[\w\d\' -]+$~', $_POST['artiest'] ) or trim($_POST['artiest']) == '' ) {
$aErrors['artiest'] = 'Vul een geldige Artiest naam in.';
}

// Een Album/Single Titel heeft letters, spaties en misschien een apostrof of koppelteken
// maar niet alleen spaties
if ( !isset($_POST['titel']) or !preg_match( '~^[\w\d\' -]+$~', $_POST['titel'] ) or trim($_POST['titel']) == '' ) {
$aErrors['titel'] = 'Vul een geldige Titel naam in.';
}

// Een Bericht bevat letters en spaties
if ( !isset($_POST['bericht']) ) {
$aErrors['bericht'] = 'Vul een geldige Bericht in. ';
}

// Een Type bevat letters en spaties
if ( !isset($_POST['youtube']) ) {
$aErrors['youtube'] = 'Vul een geldige Youtube Code in. ';
}

// Een Type bevat letters en spaties
if ( !isset($_POST['type']) ) {
$aErrors['type'] = 'Vul een geldige Type in. ';
}

for($i=1;$i<=(int)($_POST["track_nr"]);$i++)
{
// Een track_nr bevat letters en spaties (minimaal 3)
if ( !isset($_POST['track_nr'.$i]) ) {
$aErrors['track_nr'.$i] = 'Vul een geldige Track_nr in. Minimaal 1 cijfer !! ';
}

// Een track bevat letters en spaties (minimaal 3)
if ( !isset($_POST['track'.$i]) or !preg_match( '~^[\w ]{3,}$~', $_POST['track'.$i] ) ) {
$aErrors['track'.$i] = 'Vul een geldige Track in. Minimaal 3 Letters !! ';
}

//Geen errors gevonden. We kunnen beginnen met het uitvoeren en webschrijfen van de gegevens.
if ( count($aErrors) == 0 )
{
// start transactie
$query->query( "START TRANSACTION" );

// Zet de DEBUG_MODE Aan (true) of Uit (false)
// Het is aan te raden om true alleen te gebruiken bij het testen van de script.
define( 'DEBUG_MODE', true );

// voeg de gebruiker toe
if ( $query->query( "INSERT INTO
albums
(
artiest,
titel,
bericht,
youtube,
type,
datetime
)
VALUES
(
'".mysqli_real_escape_string($query,$_POST[ 'artiest' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'titel' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'bericht' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'youtube' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'type' ])."',
NOW()
)" ) )
{

// de query is gelukt, voeg het adres toe
$strQuery = sprintf(
"INSERT INTO
album_track
(
album_id,
track_nr,
track
)
VALUES
(
%d,
'".mysqli_real_escape_string($query,$_POST[ 'track_nr'.$i ])."',
'".mysqli_real_escape_string($query,$_POST[ 'track'.$i ])."'
)",
$query->insert_id
);

$result = mysqli_query($query, $strQuery, MYSQLI_USE_RESULT);

// Hier beginnen wij met de Fout Afhandeling
// Voor meer info zie: http://www.pfz.nl/wiki/mysql-foutafhandeling-in-php
if ( false === $result )
{
echo '<p>Er is iets fout gegaan bij het invoeren van de Album/Single gegevens.<br />';
$var = var_dump($_POST[‘username’]);
echo '<pre>';
print_r($_REQUEST);
echo '</pre>';

if ( constant( 'DEBUG_MODE' ) )
{
echo '<br />Foutmelding: ' . mysql_error() . '
<br />Query: ' . htmlspecialchars( $strQuery );
}
echo '</p>';
}
else
{
if ( $query->query( $strQuery ) )
{
// beide queries zijn gelukt, voltooi de transactie
$query->query( "COMMIT" );
echo 'De Album/Single is toegevoegd';
echo '<pre>';
print_r($_POST);
echo '</pre>';
}
else
{
// de Trackquery is mislukt, maak de transactie ongedaan
$query->query( "ROLLBACK" );
echo 'De Album/Single is niet toegevoegd, de track(s) kon niet worden opgeslagen';
$var = var_dump($_POST[‘artiest’]);

}
}


}
else
{
// de Albumquery is mislukt, beëindig de transactie
echo 'De Album/Single is niet toegevoegd aan de tabel Albums';
$query->query( "ROLLBACK" );
}
}
}
}

?>

toevoegen.php
<fieldset>
<legend>Track Informatie:</legend>
<table width="550">
<tr>
<td width="85" valign="top" align="right">
Track Nr:
</td>
<td>
<?php echo isset($aErrors["track_nr".$i]) ? '<td class="error">' : '<td>' ?>
<input type="text" name="track_nr1" size="6" value="<?php echo isset($_POST["track_nr".$i]) ? htmlspecialchars($_POST["track_nr".$i]) : '' ?>" /><br />
<span id="mySpan"></span>
</td>
<td width="75" valign="top" align="right">
Track:
</td>
<td align="left">
<?php echo isset($aErrors["track".$i]) ? '<td class="error">' : '<td>' ?>
<input type="text" name="track1" size="35" value="<?php echo isset($_POST["track".$i]) ? htmlspecialchars($_POST["track".$i]) : '' ?>" /><br />
<span id="mySpan1"></span>
</td>
<td width="100" valign="top">
<input name="Create" type="button" value="+" onclick="Javascript:fncCreateElement();">
<input name="Delete" type="button" value="-" onclick="Javascript:fncDeleteElement();">
</td>
</tr>
</table>
</fieldset>
Op regel 5 gebruik je al $i, die is daar niet bekend. Verder zitten beide INSERTs in de for-loop.
- SanThe - op 13/10/2011 23:44:35

Op regel 5 gebruik je al $i, die is daar niet bekend. Verder zitten beide INSERTs in de for-loop.


Dat klopt.
Ik heb al te horen gekregen om een foreach te gebruiken rond mijn 2e INSERT.
Zald an moeten worden als:
<?php
foreach($track as $key => $value)
{
// Hier mijn While loop
}
?>

De input moet dan zoals:
<input name="track[]" />
<input name="track[]" />
Dan haal ik alle .$i weg bij de track.
Dan blijft die gooien dat ik minimaal 3 letter moet vullen in mijn input van de track.

En je hebt wel alle POST-vars van track vervangen door $value?
Je bedoelt dat ik dan dit heb?

<?php echo isset($aErrors['track']) ? '<td class="error">' : '<td>' ?>
<input type="text" name="track[]" size="35" value="<?php echo isset($value['track']) ? htmlspecialchars($value['track']) : '' ?>" />
<input type="text" name="track[]" size="35" value="<?php echo isset($value['track']) ? htmlspecialchars($value['track']) : '' ?>" />

In plaats van
<?php echo isset($aErrors['track') ? '<td class="error">' : '<td>' ?>
<input type="text" name="track[]" size="35" value="<?php echo isset($_POST['track'.$i]) ? htmlspecialchars($_POST['track']) : '' ?>" />
<input type="text" name="track[]" size="35" value="<?php echo isset($_POST['track'.$i]) ? htmlspecialchars($_POST['track']) : '' ?>" />

Mag ik dan nergens meer een $_POST gebruiken als ik die foreach gebruik?


Het moet zijn:
<?php
foreach($_POST['track'] as $value)

// dan verderop
echo isset($value) ? htmlspecialchars($value) : ''
?>

[size=xsmall]Toevoeging op 14/10/2011 00:06:08:[/size]

Zet dit bovenin je script:

<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

// rest

?>
Zal er vannacht eens mee aan de stoei gaan.

Maar in jou voorbeeld.
Wat voert nu die [] dan eigelijk uit?
Dat deed die $key toch?


En neem aan de foreach loop over mijn 2e INSERT zetten?
Omdat jij nu <input name="track[]" />gebruikt is $_POST['track'] een array().
- SanThe - op 14/10/2011 00:18:48

Omdat jij nu <input name="track[]" />gebruikt is $_POST['track'] een array().

Oke dat is duidelijk.

Maar even voor alle duidelijkheid voor ik ga veranderen.

De foreach loop zet ik om mijn 2e INSERT TO.
Vervang in mijn INSERT TO de $_POST['$track'.$i] naar $value.

Vervang $_POST['$track'.$i] verder overal in $_POST['track']

Klopt deze opzet?



[size=xsmall]Toevoeging op 14/10/2011 01:14:38:[/size]

Ik heb nu het volgende

De foreach loop over mijn 2e INSERT To gezet.
En de input field aangepast.

Hij post nu niks meer naar de database. Krijg zelfs geen error of wat dan ook te zien. Ook als ik nu de iput velden leeg laat hoort hij een melding te geven en de input velden rood te maken. Dit doet hij allemaal niet meer.

insert.php
<?php
// Er word iets gepost met het Formulier.
// We gaan de gegevens ophalen en daarna kijken of alles klopt.

if ( $_SERVER['REQUEST_METHOD'] == 'POST' &&
isset($_POST['artiest'], $_POST['titel'], $_POST['bericht'], $_POST['youtube'], $_POST['type'], $_POST['track_nr'], $_POST['track']) )
{

// We gaan de errors in een array bijhouden
$aErrors = array();

// Een Album/Single Artiest naam heeft letters, spaties en misschien een apostrof of koppelteken
// maar niet alleen spaties
if ( !isset($_POST['artiest']) or !preg_match( '~^[\w\d\' -]+$~', $_POST['artiest'] ) or trim($_POST['artiest']) == '' ) {
$aErrors['artiest'] = 'Vul een geldige Artiest naam in.';
}

// Een Album/Single Titel heeft letters, spaties en misschien een apostrof of koppelteken
// maar niet alleen spaties
if ( !isset($_POST['titel']) or !preg_match( '~^[\w\d\' -]+$~', $_POST['titel'] ) or trim($_POST['titel']) == '' ) {
$aErrors['titel'] = 'Vul een geldige Titel naam in.';
}

// Een Bericht bevat letters en spaties
if ( !isset($_POST['bericht']) ) {
$aErrors['bericht'] = 'Vul een geldige Bericht in. ';
}

// Een Type bevat letters en spaties
if ( !isset($_POST['youtube']) ) {
$aErrors['youtube'] = 'Vul een geldige Youtube Code in. ';
}

// Een Type bevat letters en spaties
if ( !isset($_POST['type']) ) {
$aErrors['type'] = 'Vul een geldige Type in. ';
}

// Een track_nr bevat letters en spaties (minimaal 3)
if ( !isset($_POST['track_nr']) ) {
$aErrors['track_nr'] = 'Vul een geldige Track_nr in. Minimaal 1 cijfer !! ';
}

// Een track bevat letters en spaties (minimaal 3)
if ( !isset($_POST['track']) or !preg_match( '~^[\w ]{3,}$~', $_POST['track'] ) ) {
$aErrors['track'] = 'Vul een geldige Track in. Minimaal 3 Letters !! ';
}

//Geen errors gevonden. We kunnen beginnen met het uitvoeren en webschrijfen van de gegevens.
if ( count($aErrors) == 0 )
{
// start transactie
$query->query( "START TRANSACTION" );

// Zet de DEBUG_MODE Aan (true) of Uit (false)
// Het is aan te raden om true alleen te gebruiken bij het testen van de script.
define( 'DEBUG_MODE', true );

// voeg de gebruiker toe
if ( $query->query( "INSERT INTO
albums
(
artiest,
titel,
bericht,
youtube,
type,
datetime
)
VALUES
(
'".mysqli_real_escape_string($query,$_POST[ 'artiest' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'titel' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'bericht' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'youtube' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'type' ])."',
NOW()
)" ) )
{
foreach($_POST['track'] as $value)
{
// de query is gelukt, voeg het adres toe
$strQuery = sprintf(
"INSERT INTO
album_track
(
album_id,
track_nr,
track
)
VALUES
(
%d,
'".mysqli_real_escape_string($query,$_POST[ 'track_nr' ])."',
'".mysqli_real_escape_string($query,$_POST[ 'track' ])."'
)",
$query->insert_id
);
}
$result = mysqli_query($query, $strQuery, MYSQLI_USE_RESULT);

// Hier beginnen wij met de Fout Afhandeling
// Voor meer info zie: http://www.pfz.nl/wiki/mysql-foutafhandeling-in-php
if ( false === $result )
{
echo '<p>Er is iets fout gegaan bij het invoeren van de Album/Single gegevens.<br />';
$var = var_dump($_POST[‘username’]);
echo '<pre>';
print_r($_REQUEST);
echo '</pre>';

if ( constant( 'DEBUG_MODE' ) )
{
echo '<br />Foutmelding: ' . mysql_error() . '
<br />Query: ' . htmlspecialchars( $strQuery );
}
echo '</p>';
}
else
{
if ( $query->query( $strQuery ) )
{
// beide queries zijn gelukt, voltooi de transactie
$query->query( "COMMIT" );
echo 'De Album/Single is toegevoegd';
echo '<pre>';
print_r($_POST);
echo '</pre>';
}
else
{
// de Trackquery is mislukt, maak de transactie ongedaan
$query->query( "ROLLBACK" );
echo 'De Album/Single is niet toegevoegd, de track(s) kon niet worden opgeslagen';
$var = var_dump($_POST[‘artiest’]);

}
}


}
else
{
// de Albumquery is mislukt, beëindig de transactie
echo 'De Album/Single is niet toegevoegd aan de tabel Albums';
$query->query( "ROLLBACK" );
}
}
}?>

toevoegen.php de input fields.
<?php echo isset($aErrors['track']) ? '<td class="error">' : '<td>' ?>
<input type="text" name="track[]" size="35" value="<?php echo isset ($value) ? htmlspecialchars ($value) : '' ?>" />
<input type="text" name="track[]" size="35" value="<?php echo isset ($value) ? htmlspecialchars ($value) : '' ?>" /><br />
Je kan $_POST['$track'.$i] in $value veranderen in de INSERT. Maar dat gaat niet op in je formulier want dan krijgen ze allemaal dezelfde waarde.
Hoe los ik dit dan wel op?

EDIT

Ik heb nu alleen in de INSERT $value staan.
De rest is dan gewoon $_POST['track']

Nu graag ik een warring in mijn input veld:
<br /><b>Warning</b>: htmlspecialchars() expects parameter 1 to be string, array given in <b>.....\albums\toevoegen.php</b> on line <b>99</b><br />

Reageren