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

<?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
<?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
Er zijn een aantal mogelijkheden, die op 't zelfde neerkomen.

Lijn 25, maak daar eens van:
<?php
echo "<input type='checkbox' name='approvedtweet[" . $row['id'] . "]' />";
?>


Afhandelen, gebeurt dan met iets als

<?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?


Ik heb er nu dit van gemaakt:

<?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:
<?php
name='approvedtweet[" . $row['id'] . "]'
?>

en dit:
<?php
($_POST['approvedtweet'] as $id=>$value)
?>

nog niet helemaal...
Het gaat daar ook nog mis denk ik.
Gezien hij simpelweg alles in "yes" veranderd.
Dit heeft niet zoveel zin:
<?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.
<?php
mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no' AND id='" . mysql_real_escape_string($value) . "'");
?>
(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?
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?

<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no'");
}
?>

<?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?

<?php
echo "<form method='post' action='checkbox_engine.php'>";
?>
Dit doe je dus nog steeds verkeerd...
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no'");
}
?>
Of is dit nog oude code?
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...
<?php
foreach ($_POST['approvedtweet'] as $id=>$value) {
mysql_query("UPDATE tweets SET checkbox='yes' WHERE checkbox='no' AND id='" . mysql_real_escape_string($value) . "'");
}
?>
Okay, toch even mijn punt maken.

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

<?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.

Reageren