[php] Elk woord in tekstvak naar nieuwe regel in tabel MYSQL

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Voor een project op school proberen wij het volgende te doen.
Wij willen een tekstvak op een pagina die om de zoveel aantal seconden automatisch naar MYSQL schrijft.
Maar elk woord moet op een apparte regel komen. Het automatisch schrijven is ons nu gelukt maar de aparte regels niet.

Wat wij willen is dus dat elk woord in dat tekstvak (dus na een spatie) op een nieuwe regel wordt gezet in de database

Het gaat alleen om het veld "content" Dus als er 30 woorden staan in het tekstveld "content" op de pagina dan moeten er 30 regels in de database komen.

Database velden:
ID
title
content
timestamp

Wij hebben al wat dingen geprobeert maar dat liep op niks uit. En we kunnen het niet echt vinden op het internet. Kan iemand ons hiermee helpen?

Alvast bedankt :)

HTML:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
//include DB configuration file
include('db_config.php');

//Connect to database
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_table);



$article_id = mysql_insert_id();


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Shoutwall</title>
    <script type="text/javascript" src="jquery1.2.js"></script>
    <style type="text/css">
            body{font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px}
            h1, h2{font-size:20px;}
    </style>
</head>

<body>
    <script type="text/javascript">
    $(document).ready(function(){           
        autosave();
    });
    
    function autosave()
    {
        var t = setTimeout("autosave()", 5000);
                        
        var title = $("#txt_title").val();
        var content = $("#txt_content").val();
            
        if (title.length > 0 || content.length > 0)
        {
            $.ajax(
            {
                type: "POST",
                url: "autosave.php",
                data: "article_id=" + <?php echo $article_id ?> + "&title=" + title + "&content=" + content,
                cache: false,
                success: function(message)
                {   
                    $("#timestamp").empty().append(message);
                }
            });
        }
    } 
    </script>   
<!-- Het form -->
    <form id="article_form" method="post" action="save.php">
        Titel:<br />
        <input type="text" name="title" id="txt_title" size="50" maxlength="50"/><br />
        Inhoud: <i>Maximaal 255</i>:<br />
        <textarea name="content" id="txt_content" cols="50" rows="5"></textarea><br />
        <input type="hidden" name="article_id" value="<?php echo $article_id ?>" />
        <input type="submit" value="Handmatig opslaan"/><br />
    </form>
    <div id="timestamp"></div>

</body>
</html>


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
//include DB configuration file
include('db_config.php');

//Connect to database
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_table);


$title = mysql_real_escape_string($_POST['title']);
$content = mysql_real_escape_string($_POST['content']);
$id = (int)$_POST['article_id'];

//save contents to database
mysql_query("UPDATE `articles` SET title = '$title', content = '$content' WHERE id = '$id'");




//output timestamp
echo 'Automatisch opgeslagen in database! ';
?>

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
in PHP de content exploden, en over de resulterende array loopen.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

PHP:
1
2
3
4
$content_array = explode(' ', $content);
foreach($content_array as $c) {
  // $c wegschrijven naar MySQL
}


Zie dus Explode

Overigens zal je de query ook moeten aanpassen, op dit moment update je telkens dezelfde regel door de WHERE-clause. Nu zal je echter voor elke $c een aparte regel willen, wat is precies de bedoeling?

[ Voor 64% gewijzigd door Ram0n op 10-06-2010 13:13 . Reden: Aanvullende vraag ]

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ram0n schreef op donderdag 10 juni 2010 @ 13:10:
PHP:
1
2
3
4
$content_array = explode(' ', $content);
foreach($content_array as $c) {
  // $c wegschrijven naar MySQL
}


Zie dus Explode

Overigens zal je de query ook moeten aanpassen, op dit moment update je telkens dezelfde regel door de WHERE-clause. Nu zal je echter voor elke $c een aparte regel willen, wat is precies de bedoeling?
Bedankt voor je reactie

De bedoeling is dat elke woord in het tekstvak op de html pagina in een nieuwe regel verschijnt in MYSQL.
Dus als er in het tekstvak "content" 10 woorden staat moeten er ook 10 regels aangemaakt worden in MYSQL met elk woord op een nieuwe regel.

Waar moet ik dat stukje code van je precies neerzetten?

Dank u! ;)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Vertel ons eerst eens even wat jij met 'regel' bedoelt. Ik krijg namelijk een beetje een donker bruin vermoeden dat je het niet over regels, maar records hebt. Daarnaast vind ik je code heel erg vreemd. Vooral de plek van de last insert id.

Begin eens met iets duidelijker omschrijven wat nu precies je requirements zijn en duik daarbij niet gelijk een technische oplossing in.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op donderdag 10 juni 2010 @ 13:34:
Vertel ons eerst eens even wat jij met 'regel' bedoelt. Ik krijg namelijk een beetje een donker bruin vermoeden dat je het niet over regels, maar records hebt. Daarnaast vind ik je code heel erg vreemd. Vooral de plek van de last insert id.

Begin eens met iets duidelijker omschrijven wat nu precies je requirements zijn en duik daarbij niet gelijk een technische oplossing in.
Ik bedoel idd een record ;)

Ik ben nu bezig met een voorbeeld die in de link van Ram0n hierboven staat.
http://nl3.php.net/manual/en/function.explode.php

In wil graag "// Example 2" van "Example #1 explode() examples" :P gebruiken op die site
Dit staat er als voorbeeld:

PHP:
1
2
3
4
5
// Example 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *


Ik heb dit nu zo in mijn code staan om het exploden te testen

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
<?php
//include DB configuration file
include('db_config.php');

//Connect to database
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_table);

$title = mysql_real_escape_string($_POST['title']);
$content = mysql_real_escape_string($_POST['content']);
$id = (int)$_POST['article_id'];

// Example 2 
$data = "$content";
list($1, $2, $3) = explode(" ", $data);
echo $1; 
echo $2;
echo $3;

//save contents to database
mysql_query("UPDATE `articles` SET title = '$title', content = '$content' WHERE id = '$id'");

//output timestamp
echo 'Automatisch opgeslagen in database! ';


?>


Maar ik krijg de volgende foutmelding:

Parse error: parse error, expecting `T_VARIABLE' or `'$'' in C:\wamp\www\autosave\autosave.php on line 15

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

list($1, $2, $3) = explode(" ", $data); // regel 15
Een variabele moet altijd met een letter beginnen. Bij een regex mag dat wel, maar dat is weer een ander verhaal (daar is het een variabele van de regex engine, niet van php zelf, het staat dan ook binnen een string).

Bron: http://www.php.net/manual/en/language.variables.basics.php

[ Voor 5% gewijzigd door Feanathiel op 10-06-2010 14:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Feanathiel schreef op donderdag 10 juni 2010 @ 14:14:
[...]


Een variabele moet altijd met een letter beginnen. Bij een regex mag dat wel, maar dat is weer een ander verhaal (daar is het een variabele van de regex engine, niet van php zelf, het staat dan ook binnen een string).

Bron: http://www.php.net/manual/en/language.variables.basics.php
Ja bedankt! :)

Dit werkt nu:

PHP:
1
2
3
4
5
6
// de explode :p
$data = "$content";
list($a, $b, $c) = explode(" ", $data);
echo $a;  
echo $b; 
echo $c;


Ik ga nu proberen om dit naar aparte records te schrijven

Dank u !

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Begin dan eerst eens even uit te vogelen hoe je nu eigenlijk daadwerkelijk je database wilt in gaan zetten. Het opsplitsen van een string in zijn losse woorden is dan zo ongeveer de minste van je problemen. Begin alvast met het idee uit je hoofd te zetten dat er 'regels' in je database staan. Dat zou bij jezelf het idee kunnen geven dat er een volgorde in zit. Zolang je zelf geen volgorde definieert is dat namelijk niet (gegarandeerd) het geval.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
De snelste manier om de woorden in je database te krijgen is waarschijnlijk, het replacen van de spaties bij " '),(' " en dan iets als onderstaande regel van te maken :
code:
1
INSERT INTO brieftabel(woordcolumn) VALUES('Hello'),('new'),('world'),('!');

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Verwijderd schreef op donderdag 10 juni 2010 @ 14:06:
[...]


Ik bedoel idd een record ;)

Ik ben nu bezig met een voorbeeld die in de link van Ram0n hierboven staat.
http://nl3.php.net/manual/en/function.explode.php

In wil graag "// Example 2" van "Example #1 explode() examples" :P gebruiken op die site
Dit staat er als voorbeeld:

PHP:
1
2
3
4
5
// Example 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *


Ik heb dit nu zo in mijn code staan om het exploden te testen

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
<?php
//include DB configuration file
include('db_config.php');

//Connect to database
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_table);

$title = mysql_real_escape_string($_POST['title']);
$content = mysql_real_escape_string($_POST['content']);
$id = (int)$_POST['article_id'];

// Example 2 
$data = "$content";
list($1, $2, $3) = explode(" ", $data);
echo $1; 
echo $2;
echo $3;

//save contents to database
mysql_query("UPDATE `articles` SET title = '$title', content = '$content' WHERE id = '$id'");

//output timestamp
echo 'Automatisch opgeslagen in database! ';


?>


Maar ik krijg de volgende foutmelding:

Parse error: parse error, expecting `T_VARIABLE' or `'$'' in C:\wamp\www\autosave\autosave.php on line 15
Die regel:
PHP:
1
2
3
<?php
list($1, $2, $3) = explode(" ", $data);
?>

Dit gaat goed, totdat er meer dan 3 woorden ingevuld worden in het tekstvak, dan flopt je code. Waarom gebruik je niet gewoon arrays? Over die array kan je dan weer itereren met foreach() en dan bouw je je INSERT query op.

Voorbeeldje in (pseudo)code:
PHP:
1
2
3
4
5
6
<?php
$array = explode(" ", $data);
foreach($array as $value) {
   //Doe wat je wilt met $value hier, waarschijnlijk ga je er een INSERT query mee opbouwen
}
?>


Voor meer info over array's: PHP Array's

Heb je ook al over het volgende nagedacht:

- Een user voert woorden in
- De autosave() functie slaat ze op
- De user voert nog meer woorden in
- Die worden ook weer opgeslagen door de autosave() functie

Wat gebeurt er nu:

Een deel van de waarden wordt dubbel opgeslagen in de DB (de woorden die de user als eerste invulde).

Mocht je dit niet willen, dan zou je het volgende kunnen doen:

- REPLACE INTO i.p.v. INSERT INTO (moet je wel zorgen voor gelijke ID's bij gelijke velden, anders komt er alsnog een nieuw record)
- De form submitten zodra er een nieuw woord is toegevoegd, en alleen het laatste woord submitten
- Reeds geplaatste woorden serverside cachen met PHP (zet ze in de $_SESSION bijvoorbeeld)
- Clientside cachen met JavaScript (bouw bijv. een array op met reeds gesubmitte woorden)
- Er zijn vast nog veel meer opties :P

Let op bij het cachen:
- Stel de user voert de volgende string in:
foo bar foo bar2

Als je bij het cachen kijkt of iets al in een array zit, dan flopt het dus bij de 2e keer foo, het is een nieuw woord, maar is ook al reeds ingevoerd (en zal door het caching mechanisme dus niet gesubmit worden). Of dit wenselijk is, hangt van jouw ontwerpkeuzes af.

Verder nog:
- Ik mis de error afhandeling van je AJAX requests (m.a.w.: wat gebeurt er als het request niet aankomt bij de server o.i.d.?)
- Je constructie met mysql_insert_id() kan niet goed gaan, want:
Retrieves the ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT).
The ID generated for an AUTO_INCREMENT column by the previous query on success, 0 if the previous query does not generate an AUTO_INCREMENT value, or FALSE if no MySQL connection was established.
Voor zover ik aan jouw code kan zien is je $article_id altijd 0, omdat je na het connecten nog geen insert query hebt uitgevoerd. (Vraagje: Krijg je geen MySQL errors met duplicate primary keys? (als ID tenminste je primary key is?))

- Tot slot: Je naamgeving van de div timestamp en bijbehorende JavaScript vind ik niet heel erg helder, met timestamp wordt in de programmeer wereld meestal een Unix timestamp bedoeld (PHP Timestamps) en geen bericht o.i.d.

Zo nu vind ik het wel weer genoeg ;)
Pagina: 1