[PHP] Tracklist ontleden en in database zettten.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou ik ben bezig met een scriptje om mijn cd's een beetje te ordenen.
Nu wil ik dat allemaal in een database zetten.

Ik wil dus een tracklist van een cd kopieren in een textveld.
PHP moet vervolgens van iedere regel de artiest en titel scheiden en opslaan in een variabele zodat deze in de database kan worden gezet.
En beide een nummer meegeven dat gelinkt is aan de titel van de cd.

Zodat ik later dus kan zoeken op cd/titel/artiest en zo dus kan zien welke tracks op welke cd's staan en per track op welke cd die staat. Daar het voor gaat komen dat een track op meerder cd's staat en het dus overbodig is om die track meerdere keren in de dbase te zetten.

Ik hoop dat jullie mijn probleem een beetje snappen en me verder kunnen helpen.

Tracklist ziet er ongeveer zo uit.

artist - title
artist - title
artist - title
etc.

Zover ben ik op dit moment al.

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
include ("database.php");
if($_POST['submit'])
// Delimiters may be slash, dot, or hyphen
while ($cut = explode(" - ", $tracklist)){
mysql_query("INSERT INTO music (ID, artist, title) VALUES('NULL','$cut[0]','$cut[1]')") or die(mysql_error());
echo "$cut[0] $cut[1]";
} 

?> 


Maar dit geeft dus een eindeloze loop.
En als ik verder ga dan een regel van de tracklist ziet het script het regeleinde niet.

Wie kan me verder helpen of in de goede richting schoppen?

[ Voor 3% gewijzigd door Verwijderd op 18-08-2006 04:15 . Reden: regeleinde probleem toegevoegd ]


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Waar haal je $tracklist vandaan eigenlijk? Bedoel je niet $_POST["tracklist"] ?


Probeer dit eens:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$sTracklist="blaat - test
bloot - test
bleet - test";
// Delimiters may be slash, dot, or hyphen


$aInfo = explode("\n", $sTracklist);

for ($i = 0; $i < count ($aInfo); $i++)
{
    $aTemp = explode("-", $aInfo[$i]);
    echo $aTemp[0] . " --- " . $aTemp[1];
    // De Query met $aTemp[0] (artiest) en $aTemp[1] (song)
}

?>

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Voer de queries niet in een loop uit, dat duurt veel te lang. Je kunt beter werken met een extended insert:
PHP:
1
2
3
4
5
6
$ar_values = array();
while ( $cut = explode(" - ", $tracklist) ) {
    $ar_values[] = "NULL, '$cut[0]','$cut[1]'";
}
$query = "INSERT INTO music (ID, artist, title) " .
        "VALUES(" . implode( "),\n(", $ar_values ) . ");";


Dan krrijg je een query die er zo uitziet:
SQL:
1
2
3
4
INSERT INTO table (hoi, leuk, hier), VALUES
(1, 2, 3),
(4, 5, 8),
(4, 5, 5);

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JayVee schreef op vrijdag 18 augustus 2006 @ 10:00:
Voer de queries niet in een loop uit, dat duurt veel te lang. Je kunt beter werken met een extended insert:
PHP:
1
2
3
4
5
6
$ar_values = array();
while ( $cut = explode(" - ", $tracklist) ) {
    $ar_values[] = "NULL, '$cut[0]','$cut[1]'";
}
$query = "INSERT INTO music (ID, artist, title) " .
        "VALUES(" . implode( "),\n(", $ar_values ) . ");";


Dan krrijg je een query die er zo uitziet:
SQL:
1
2
3
4
INSERT INTO table (hoi, leuk, hier), VALUES
(1, 2, 3),
(4, 5, 8),
(4, 5, 5);
dan krijg ik dus deze error.

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 130 bytes) in public_html/mdb/splitter.php on line 20

Lijn 20 is dan de lijn waar je de array vult.
Dit gebeurt dus als ik het script laad en dus nog niks ingevoerd heb.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
TRON schreef op vrijdag 18 augustus 2006 @ 05:52:
Waar haal je $tracklist vandaan eigenlijk? Bedoel je niet $_POST["tracklist"] ?


Probeer dit eens:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$sTracklist="blaat - test
bloot - test
bleet - test";
// Delimiters may be slash, dot, or hyphen


$aInfo = explode("\n", $sTracklist);

for ($i = 0; $i < count ($aInfo); $i++)
{
    $aTemp = explode("-", $aInfo[$i]);
    echo $aTemp[0] . " --- " . $aTemp[1];
    // De Query met $aTemp[0] (artiest) en $aTemp[1] (song)
}

?>
$tracklist word gewoon opgehaald uit het formpje. Dus $tracklist is de naam van het textveld. Moet ik daar $_POST["tracklist"] voor gebruiken?

Dit scriptje geef trouwens lege velden in de dbase.
en als echo gewoon ---
Dus volgens mij word de array niet goed gevuld?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Kijk aub eens heel erg goed naar de while. $tracklist verandert in de while nooit van waarde en $cut zal dus altijd een waarde hebben. Nogal logisch dat dat een oneindige loop geeft :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hmmm ik heb 'm bijna volgens mij.

PHP:
1
2
3
4
5
6
7
8
$lines = explode("\n", $tracklist);

for ($i = 0; $i < count ($lines); $i++) { 
$cut = explode(" - ", $lines[$i]); 
mysql_query("INSERT INTO music (ID, artist, title) VALUES('NULL','$cut[0]','$cut[1]')") or die(mysql_error());
echo "$cut[0] $cut[1] \n";

}


Nu is het wel een raar probleem wat ik heb...
bij de 2e explode is het schijnbaar een probleem als er meer woorden na het streepje staan.

Promo – That ain’t real
Neophyte & Evil Activities - Everlast

dus in dit geval zou Promo in z'n geheel in het Artist veld komen terwijl de track eronder gewoon netjes opgesplitst word.

/edit
list($artist, $title) = split(" - ", $lines[$i]);
doet precies hetzelfde :/

/edit2
$artist = strtok($lines[$i], '-');
$title = strtok('-');

ook strtok doet precies hetzelfde 8)7
de fout kan toch niet in m'n query zitten? toch?

[ Voor 15% gewijzigd door Verwijderd op 19-08-2006 00:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Promo – That ain’t real
Neophyte & Evil Activities - Everlast

Het was dus het verschil in het streepje 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou om het dan even af te ronden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
include ("database.php");
if($_POST['submit'])
$streepje = "&#8211;";
$streepje2 = "-";

$tracklist2 = str_replace($streepje, $streepje2, $tracklist);

$lines = explode("\n", $tracklist2);

for ($i = 0; $i < count ($lines); $i++) { 
$cut = explode(" - ", $lines[$i]); 
mysql_query("INSERT INTO music (artist, title) VALUES('$cut[0]','$cut[1]')") or die(mysql_error());
echo "$cut[0] $cut[1] \n";

} 

?>

Wat dit scriptje dus doet is een tracklist op knippen in artiest en titel en het in een database zetten.

Bedankt voor jullie hulp :)

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Jammer dat je de tip van JayVee niet even meeneemt in je script :)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Denk je dat het veel verschil maakt in een tracklist van 18 regels?
Voor langere tracklists zou het waarschijnlijk beter zijn.

Ik zal strax eens proberen en eens timen hoe lang beide duren

Maar nu ben ik al tegen het volgende probleem aangelopen.
Ik moet dus om de tracks aan de albums te linken een tabel maken waar iedere album een aantal trackid's meekrijgt zodat als ik een album ophaal ik ook kan zien welke tracks er op staan. Nu zal het natuurlijk voorkomen dat een track op meerdere albums staat dus moet ik meerdere album id's aan een track mee kunnen geven.
Maar met het eerste gedeelte kom ik al niet verder.

Ik haal de id's op en wil ze naar de database versturen. Nu krijg ik de trackid's schijnbaar wel opgehaald want een echo geeft de id's weer. maar de query om ze in de database te zetten werkt niet?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

include ("database.php");
if($_POST['submit'])
mysql_query("INSERT INTO album (album, year, media, owned) VALUES('$album', '$year', '$media', '$owned')") or die(mysql_error());

$result = mysql_query("SELECT ID FROM `album` WHERE `album`='$album'");
$albumid = mysql_fetch_row($result);



$streepje = "&#8211;";
$streepje2 = "-";

$tracklist2 = str_replace($streepje, $streepje2, $tracklist);

$lines = explode("\n", $tracklist2);

for ($i = 0; $i < count ($lines); $i++) { 
$cut = explode(" - ", $lines[$i]); 
mysql_query("INSERT INTO titart (artist, title) VALUES('$cut[0]','$cut[1]')") or die(mysql_error());

$result2 = mysql_query("SELECT ID FROM `titart` WHERE `artist`='$cut[0]'");
$trackid = mysql_fetch_row($result2);
mysql_query("INSERT INTO 'link' ('albumid', 'trackid') VALUES ('$albumid[0]', '$trackid[0]'");

echo "$trackid[0]";
echo "$cut[0] $cut[1] \n";
?>


Wat zie ik over het hoofd?
Pagina: 1