Versio

Checkbox form in mysql fetch array

Overzicht Reageren

Pagina: 1 2 volgende »

Karim Bizid

Karim Bizid

06/02/2012 13:43:47
Quote Anchor link
Beste PHPers,

Ik ben even een snel pakketje aan het bouwen om tweets in een db op te slaan, dan de gebruiker de tweets te laten keuren en die vervolgens naar een groot scherm te publiceren.
Ik weet dat er misschien het een en ander met beveiliging niet helemaal op orde is, maar het is dan ook gebouwd om op een lokaal netwerk te draaien :)

Ik loop echter vast bij het keuren van de tweets.
Hieronder de code:

Tweets ophalen en in de db stoppen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
    
    $q
= $_GET["jansmit"];
    $request = "http://search.twitter.com/search.json?q=jansmit".urlencode($q);
    $response = file_get_contents($request);
    $jsonobj = json_decode($response);
    
    if($jsonobj != null){
    
    $con = mysql_connect('', '', '');
    
    if (!$con){
    die('Could not connect: ' . mysql_error());
    }

    
    foreach($jsonobj->results as $item){
    
    $id = $item->id;
    $created_at = $item->created_at;
    $created_at = strtotime($created_at);
    $mysqldate = date('Y-m-d H:i:s',$created_at);
    $from_user = mysql_real_escape_string($item->from_user);
    $from_user_id = $item->from_user_id;
    $text = mysql_real_escape_string($item->text);
    $source = mysql_real_escape_string($item->source);
    $geo = $item->geo;
    $iso_language_code = $item->iso_language_code;
    $profile_image_url = mysql_real_escape_string($item->profile_image_url);
    $to_user_id = $item->to_user_id;
    if($to_user_id==""){ $to_user_id = 0; }
    $query = mysql_real_escape_string($query);
    
    mysql_select_db("md36691db200438", $con);
    $query = "INSERT into tweets VALUES ($id,'$mysqldate','$from_user',$from_user_id,'$text','$source','$geo','$iso_language_code','$profile_image_url',$to_user_id,'$q')";
    $result = mysql_query($query);
    
    }

    
    mysql_close($con);
    }

    
    ?>


De gegevens weer uit de db halen en weergeven...
Voorbeeld zichtbaar op: http://www.v7productions.nl/citoparty/admin_tweets.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

mysql_connect('', '', '') or die(mysql_error());
mysql_select_db("md36691db200438") or die(mysql_error());

$result = mysql_query("SELECT * FROM tweets")
or die(mysql_error());

echo "<form method='post' action=''>";
echo "<table border='1'>";
// keeps getting the next row until there are no more to get
while($row = mysql_fetch_array( $result )) {
    // Print out the contents of each row into a table
    echo "<tr><td>";
    echo "<img src=";
    echo $row['profile_image_url'];
    echo ">";
    echo "</td><td>";
    echo $row['from_user'];
    echo "</td><td>";
    echo $row['iso_language_code'];
    echo "</td><td>";
    echo $row['text'];
    echo "</td><td>";
    echo "<input type='checkbox' name='approvedtweet' value='1' />";
    echo "</td></tr>";
}


echo "</table>";
echo "<input type='submit' name='formSubmit' value='Submit' /> </form>";

?>


Zoals je ziet heb ik al zitten spelen met een <form> en checkboxes...

Wat ik probeer

Ik heb in m'n mysql tabel een rij "checkbox" met een standaard waarde van null.
Bij het klikken op de checkbox, achter de tweets die de gebruiker wil publiceren, moet deze waarde geüpdatet worden naar 1.
Zodat ik in het grote videoscherm gewoon de tweets met de checkbox waarde "1" uit de db kan roepen.

Op inet vind ik veel over checkbox forms, maar dan gaat het over een vast aantal resultaten...
En dat is hier natuurlijk niet het geval...

Iemand die mij een duwtje in de goede richting kan geven?

Hoor het graag!

Karim
Gewijzigd op 06/02/2012 13:47:47 door Karim Bizid
 
PHP hulp

PHP hulp

24/05/2012 00:32:38
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Kris Peeters

Kris Peeters

06/02/2012 15:08:14
Quote Anchor link
Er zijn een aantal mogelijkheden, die op 't zelfde neerkomen.

Lijn 25, maak daar eens van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    echo "<input type='checkbox' name='approvedtweet[" . $row['id'] . "]' />";
?>



Afhandelen, gebeurt dan met iets als

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
...
foreach ($_POST['approvedtweet'] as $id=>$value) {
  // $id in nu de id van de checkbox.
  // in principe verschijnen enkel de aangevinkte checkboxes in de loop.
  // $value zou telkens 'on' moeten geven, maar check vooral zelf wat er gebeurt

  ...
}
...

?>


Ben je hiermee geholpen?
 
Karim Bizid

Karim Bizid

06/02/2012 16:46:28
Quote Anchor link
Ik heb er nu dit van gemaakt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no'")
or die(mysql_error());  
?>


Wat hij nu doet is alle items veranderen in "yes".

Ik snap dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
name='approvedtweet[" . $row['id'] . "]'
?>


en dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
($_POST['approvedtweet'] as $id=>$value)
?>


nog niet helemaal...
Het gaat daar ook nog mis denk ik.
Gezien hij simpelweg alles in "yes" veranderd.
 
Erwin H

Erwin H

06/02/2012 17:00:35
Quote Anchor link
Dit heeft niet zoveel zin:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
  mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no'")
}

?>

Je voert deze query nu gewoon tig keer uit, waarbij je ook tig keer dus hetzelfde doet. Gewoon alle checkboxen op yes zetten die op no stonden. Ik gok dat je hierin nog een extra clausule op wil nemen in je WHERE waarbij je zegt welke checkbox(en) dan op yes gezet moet(en) worden. Dus iets als 'WHERE id='.$id of zo.
Gewijzigd op 06/02/2012 17:01:02 door Erwin H
 
- SanThe -

- SanThe -

06/02/2012 17:03:19
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no' AND id='" . mysql_real_escape_string($value) . "'");
?>
Gewijzigd op 06/02/2012 17:06:26 door - SanThe -
 
Kris Peeters

Kris Peeters

06/02/2012 17:08:42
Quote Anchor link
(slaat enkel op de post van de vragensteller, de rest was er nog niet...)
Om te beginnen, je gaat toch niet X aantal keer die query uitvoeren?
Je kan die string opbouwen en dan in 1 keer laten uitvoeren.

De bedoeling is trouwens dat je de id's van de POST gebruikt in de WHERE-clausule; niet de waarden die al in de database steken.

Dit:
"UPDATE tweets SET checkbox='yes' WHERE checkbox='no'"
gaat over de records die al 'no' hebben in de database. Daar is niets meer van de post te merken.

Uiteindelijk moet je komen tot zoiets:
// eerst alles op no zetten
UPDATE tweets SET checkbox='no'

en dan iets als

UPDATE tweets SET checkbox='yes'
WHERE id=5 OR id=12 OR id=15

... indien enkel 5, 12 en 15 zijn aangevinkt.

Binnenin de foreach lus moet je dus eigenlijk enkel die WHERE clausule opbouwen.

lukt dat?
Gewijzigd op 06/02/2012 17:09:58 door Kris Peeters
 
Karim Bizid

Karim Bizid

06/02/2012 19:55:30
Quote Anchor link
Nee, dat is achteraf niet zo slim geweest idd...

Het wil echter nog steeds niet echt lukken...
Hij veranderd nog steeds alles of niets.
Wat zie ik over het hoofd of doe ik verkeerd?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
  mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no'");
  }

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<input type='checkbox' name='approvedtweet[" . $row['id'] . "]' />";
?>


Heeft het er misschien iets mee te maken dat de "post" van het formulier (en dus de afhalendeling) plaatsvind in een ander document?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<form method='post' action='checkbox_engine.php'>";
?>
Gewijzigd op 06/02/2012 19:55:55 door Karim Bizid
 
Erwin H

Erwin H

06/02/2012 20:15:59
Quote Anchor link
Dit doe je dus nog steeds verkeerd...
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
  mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no'");
  }

?>

Of is dit nog oude code?
 
Karim Bizid

Karim Bizid

06/02/2012 20:35:09
Quote Anchor link
Nee, ik begreep uit de vorige posts dat ik de WHERE clausule moest toevoegen aan het geheel, maar nu ik het nog eens teruglees denk ik te snappen dat de hele foreach functie niet op z'n plaats is...
 
- SanThe -

- SanThe -

06/02/2012 20:53:59
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
  mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no' AND id='" . mysql_real_escape_string($value) . "'");
  }

?>
 
Kris Peeters

Kris Peeters

07/02/2012 10:38:46
Quote Anchor link
Okay, toch even mijn punt maken.

Kijk eens (test dit even apart, los van waar je mee bezig bent) wat er gebeurt

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  $sql= "";
  if (isset($_POST['approvedtweet'])) {  // uiteraard eerst checken of de variabele bestaat
    foreach ($_POST['approvedtweet'] as $id=>$value) {
      if (empty($sql)){   // de eerste keer beb je geen OR nodig...
        $sql .= "UPDATE tweets SET checkbox='yes' WHERE id=" . (int) $id;
      }

      else {                // vanaf de tweede id heb je een OR nodig tussen elke id=...
        $sql .= ' OR id=' . (int) $id;
      }
    }
  }

  echo $sql .'<br/>';
  print_r($_POST);
}

  echo '
  <form action="" method="post">
    <input type="checkbox" name="approvedtweet[5]"/>  id = 5 <br/>
    <input type="checkbox" name="approvedtweet[12]"/> id = 12 <br/>
    <input type="checkbox" name="approvedtweet[16]"/> id = 16 <br/>
    <input type="checkbox" name="approvedtweet[18]"/> id = 18 <br/>
    <input type="checkbox" name="approvedtweet[21]"/> id = 21 <br/>
    <input type="submit"/>
  </form>
  '
;
 ?>


Wat zie je?
- De $value is telkens 'on'. Daar hoef je verder niets mee te doen.
- De checkboxes die niet aangevinkt zijn, worden niet naar de server gestuurd.
Indien je een checkbox afvinkt, wil je dat de goedkeuring op NO wordt gezet (Ja, toch? Je wil toch ook goedkeuringen terug kunnen uitzetten, of niet?).
Maar die worden dus niet naar de server gestuurd, dus je ziet in je foreach-lus nergens die afgevinkte checkboxes staan.

Wat doe je dus?
Eerst ALLE checkboces op no zetten.

UPDATE tweets SET checkbox='no'

Daarna die opgebouwde sql string uitvoeren.
Gewijzigd op 07/02/2012 10:50:03 door Kris Peeters
 
Ger van Steenderen

Ger van Steenderen

07/02/2012 11:01:58
Quote Anchor link
Waarom zetten we de id in de value van de checkbox, kan je mooi het volgende doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$ids
= implode(',',$_POST['approvedtweet']);
$sql= "UPDATE tweets SET checkbox='yes' WHERE id IN (" . $ids . ')'
?>
 
Kris Peeters

Kris Peeters

07/02/2012 11:05:16
Quote Anchor link
kan ook
 
Ger van Steenderen

Ger van Steenderen

07/02/2012 11:21:31
Quote Anchor link
Sterker nog, het is veel simpeler ;-)
 
Kris Peeters

Kris Peeters

07/02/2012 11:42:19
Quote Anchor link
Inderdaad. Merk wel op dat de meeste van mijn opmerkingen blijven gelden.
Gewijzigd op 07/02/2012 11:51:00 door Kris Peeters
 
Karim Bizid

Karim Bizid

07/02/2012 21:35:47
Quote Anchor link
Ik ben officieel in de war, haha...

Ik ben geen enorme held in PHP en kom nog niet echt verder..

Het volgende heb ik geprobeerd:

http://www.v7productions.nl/citoparty/test.php

(eerste id is aangepast naar een resultaat in mijn db)

Daarna heb ik er het volgende van gemaakt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  $ids = implode(',',$_POST['approvedtweet']);
  $sql= mysql_connect() or die(mysql_error());
  if (isset($_POST['approvedtweet'])) {  // uiteraard eerst checken of de variabele bestaat
    foreach ($_POST['approvedtweet'] as $id=>$value) {
      if (empty($sql)){   // de eerste keer beb je geen OR nodig...
        $sql .= "UPDATE tweets SET checkbox='yes' WHERE id IN (" . $ids . ')';
      }

      else {                // vanaf de tweede id heb je een OR nodig tussen elke id=...
        $sql .= ' OR id=' . (int) $id;
      }
    }
  }
 }

 
 
mysql_connect() or die(mysql_error());
mysql_select_db("md36691db200438") or die(mysql_error());
 
$result = mysql_query("SELECT * FROM tweets")
or die(mysql_error());

echo "<form method='post' action=''>";
echo "<table border='1'>";
// keeps getting the next row until there are no more to get
while($row = mysql_fetch_array( $result )) {
    // Print out the contents of each row into a table
    echo "<tr><td>";
    echo "<img src=";
    echo $row['profile_image_url'];
    echo ">";
    echo "</td><td>";
    echo $row['from_user'];
    echo "</td><td>";
    echo $row['iso_language_code'];
    echo "</td><td>";
    echo $row['text'];
    echo "</td><td>";
    echo "<input type='checkbox' name='approvedtweet[" . $row['id'] . "]' />";

    echo "</td></tr>";
}



echo "</table>";
echo "<input type='submit' name='formSubmit' value='Submit' /> </form>";

mysql_close();

?>


Ik kreeg geen output, maar zag ook geen waardes veranderen in mijn db.

Tenslotte heb ik dit nog geprobeerd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no' AND id='" . mysql_real_escape_string($value) . "'")
  }

?>


Het is idd de bedoeling dat ik uiteindelijk de goedkeuringen terug uit kan schakelen, maar zover durfde ik aan het begin van dit project nog niet te denken..

Hebben jullie nog een zet in de juiste richting voor mij?
Gewijzigd op 07/02/2012 21:36:22 door Karim Bizid
 
Ger van Steenderen

Ger van Steenderen

07/02/2012 22:34:37
Quote Anchor link
1. Je voert je sql niet uit!
2. Je moet zorgen dat je de input als volgt in je formulier komt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<input type="checkbox" name="approvedtweet[]" value="' . $row['id'] . '" />";
?>

3. Je maakt deze:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
//hier moet je zelf nog connecten met de db
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['approvedtweet'])) {  // uiteraard eerst checken of de variabele bestaat
        $ids = implode(',',$_POST['approvedtweet']);
        $sql= "UPDATE tweets SET checkbox='yes' WHERE id IN (" . $ids . ')';
        $sql .= " AND checkbox = 'no'";
        $result = mysql_query($sql);
        if ($result)
            echo 'Er zijn ' . mysql_affected_rows() . " rijen geupdate";
        else
            echo 'Oeps foutje: ' . mysql_error();
        $sql= "UPDATE tweets SET checkbox='no' WHERE id NOT IN (" . $ids . ')';
        $sql .= " AND checkbox = 'yes'";
        $result = mysql_query($sql);
        if ($result)
            echo 'Er zijn ' . mysql_affected_rows() . " rijen geupdate";
        else
            echo 'Oeps foutje: ' . mysql_error();
    }

    else { //als niets is aangevinkt bestaat $_POST['approvedtweet'] niet!!!!!!
        $sql = "UPDATE tweets SET chechbox='no' WHERE checkbox='yes'";
        $result = mysql_query($sql);
        if ($result)
            echo 'Er zijn ' . mysql_affected_rows() . " rijen geupdate";
        else
            echo 'Oeps foutje: ' . mysql_error();
    }
}

//de rest van je code
?>
Gewijzigd op 07/02/2012 22:37:35 door Ger van Steenderen
 
Kris Peeters

Kris Peeters

08/02/2012 11:02:50
Quote Anchor link
Dit is getest.
Dit werkt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
 // @see http://www.phphulp.nl/php/forum/topic/checkbox-form-in-mysql-fetch-array/82493/last/
/*
CREATE TABLE   phphulp.tweets   (
  id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  tweet   TEXT NOT NULL ,
  checkbox   VARCHAR( 10 ) NOT NULL
) ENGINE = InnoDB;
INSERT INTO   tweets   (  id  ,   tweet  ,   checkbox  ) VALUES
(1, 'tweet 1', 'yes'),
(2, 'tweet 2', 'no'),
(3, 'tweet 3', 'yes'),
(4, 'tweet 4', 'no'),
(5, 'tweet 5', 'yes'),
(6, 'tweet 6', 'no');)

*/

$con = mysql_connect('localhost', 'root', '');
mysql_select_db("phphulp", $con);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  // eerst alle goedkeuringen af zetten
  mysql_query("UPDATE tweets SET checkbox='no'");
  if (isset($_POST['approvedtweet'])) {  // uiteraard eerst checken of de variabele bestaat
    $ids = implode(',',$_POST['approvedtweet']);
    mysql_query("UPDATE tweets SET checkbox='yes' WHERE id IN (" . $ids . ')');
  }
}

$res = mysql_query("SELECT id, checkbox, tweet FROM tweets");
$records = "";
while ($row = mysql_fetch_assoc($res)) {
  $records .= '<div><input type="checkbox" name="approvedtweet[]" value="' . $row['id'] . '" ' . ($row['checkbox'] == 'yes' ? ' checked="checked"' : '') . '/>' . $row['tweet'] . '</div>' . PHP_EOL;
}

echo '<form action="" method="post">
'
. $records . '
  <input type="submit" value="OK"/>
</form>
'
;
?>
Gewijzigd op 08/02/2012 11:06:26 door Kris Peeters
 
Ger van Steenderen

Ger van Steenderen

08/02/2012 11:51:42
Quote Anchor link
@Kris
Waarom denk je dat jouw beter zou werken?
Ik vind hem zelfs slechter:
Je zet eerst alles op "no", en daarna alles wat aangevinkt is (misschien wel terug) op "ja". Dat is een botte manier van programmeren.
 
Karim Bizid

Karim Bizid

08/02/2012 12:59:36
Quote Anchor link
Kicken!!

De geselecteerde rijen worden geupdate :)

Dit lijkt alleen nog niet te werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$sql
= "UPDATE tweets SET checkbox='no' WHERE id NOT IN (" . $ids . ')';
        $sql .= " AND checkbox = 'yes'";
        $result = mysql_query($sql);
        if ($result)
            echo 'Er zijn ' . mysql_affected_rows() . " rijen geupdate";
        else
            echo 'Oeps foutje: ' . mysql_error();
    }

    else { //als niets is aangevinkt bestaat $_POST['approvedtweet'] niet!!!!!!
        $sql = "UPDATE tweets SET chechbox='no' WHERE checkbox='yes'";
        $result = mysql_query($sql);
        if ($result)
            echo 'Er zijn ' . mysql_affected_rows() . " rijen geupdate";
        else
            echo 'Oeps foutje: ' . mysql_error();
?>


De waarde in de geselecteerde rijen blijft "yes".

Denk ik een stap te moeilijk om de gevinkte checkboxes te behouden na het veranderen van de waarde in de db?
Zodat je door het wegvinken de waarde weer update naar "no"?

Dank voor alle reacties tot nu toe!
 
- SanThe -

- SanThe -

08/02/2012 13:05:46
Quote Anchor link
WHERE id NOT IN (...) moet dat niet WHERE id IN (...) zijn?
 

Pagina: 1 2 volgende »



Overzicht Reageren

Get Adobe Flash player