Seite 1 von 2

SQL Abfrage in Array lesen und wieder schreiben.

Verfasst: 11.09.2007 08:27
von Nili76
Hallo zusammen,

ich habe zwar schon gesucht, aber die richtigen Stichwörter wohl nicht eingegeben....

Ich habe mir eine SQL Abfrage gebastelt, die so aussieht :

Code: Alles auswählen

	$sql = "SELECT * FROM phpbb_user_own_links c WHERE c.user_id = " . $userdata['user_id'] . " ORDER BY c.link_id "; //$userdata['user_id'];
	if( !($result = $db->sql_query($sql)) )
	{
	message_die(GENERAL_ERROR, 'Could not query own link list', '', __LINE__, __FILE__, $sql);
	}
	$user_own_links_count = $db->sql_numrows($result);

if ( $user_own_links_count == 0 )
{	
	$own_link_name = 'Keine Links definiert';
	$template->assign_block_vars('no_link_row',array('OWN_LINK_NAME' => $own_link_name));
}

else 
{ 
	$j = 0;
while ( $row = $db->sql_fetchrow($result) )
{
	$own_link_id = $row['link_id'];	
	$own_link_name = $row['link_bez'];
	$own_link = $row['link'];	

	$template->assign_block_vars('link_row',array(
		'OWN_LINK_ID' => $own_link_id,
		'OWN_LINK_NAME' => $own_link_name,
		'OWN_LINK' => $own_link)
	);

	$j++;
}}

Hier das Template:

Code: Alles auswählen


<!-- BEGIN own_links -->
	<tr>
<td class="row1" width="38%"><span class="gensmall">Link {own_links.OWN_LINK_ID}:</span><br /></td>

	<td class="row2" width="20%">
<input type="text" class="post" style="width:200px" name="own_link_bez" size="25" maxlength="255" value="{own_links.OWN_LINK_BEZ}"/><br /></td>
<td class="row3">
<input type="text" class="post" style="width:300px" name="own_link" size="25" maxlength="255" value="{own_links.OWN_LINK}"/><br /></td>

	</tr>
<!-- END own_links -->
Nun werden mir ja nun mehrere Zeilen ausgegeben, die ich auch verändern kann. Aber wie gebe ich das wieder zurück an die Datenbank?

Ist bestimmt nur ne kleine Sache. Mit einer For Schleife vielleicht?
Also ein einfaches UPDATE TABLE geht wohl kaum, da ich da doch nur eine Variable angebe, oder geht das auch mit arrays ?

Ich danke schon jetzt für Eure (hoffentlich sinnvolle) Antwort.

Gruß
Nils

Verfasst: 11.09.2007 17:01
von Seimon
Ich hoff ich hab dich richtig verstanden...

Du könntest aus der php den Laufindex rausgeben.

Code: Alles auswählen

'COUNT' => $j,
Den hängst du dann an den Namen deiner Post-Variablen an

Code: Alles auswählen

name="own_link_bez_{own_links.COUNT}"
und kannst dann die Einträge in einer Schleife einlesen, verarbeiten und in die db schreiben.

Verfasst: 11.09.2007 19:35
von gn#36
So könnte man das zwar machen, aber noch ein wenig eleganter wäre es vielleicht so:

Code: Alles auswählen

name="own_link_bez[{own_links.COUNT}]"
Dann solltest du in PHP gleich ein Array zur Verfügung stehen haben welches du z.b. mit foreach() durchlaufen kannst.

Du kannst die Variable auch gleich ganz weglassen:

Code: Alles auswählen

name="own_link_bez[]"

Verfasst: 11.09.2007 19:37
von Seimon
Chapeau! :)

Verfasst: 12.09.2007 11:54
von Nili76
Vielen Dank für die Hilfe.

Aber leider bin ich wohl noch zu wenig in der Materie.
Wenn ich nun in der tpl die [] setze.... Wie bekomme ich denn die Werte in der php..?

Muss ich nun nicht noch irgendwo noch eine Übergabe definieren?

Ich glaube, ich hänge gerade an etwas grundsätzlichem...

Gruß
Nils

Verfasst: 12.09.2007 12:52
von gn#36
Die Übergabe regelt PHP automatisch. Du bekommst die Daten als Array in der Post Variable geliefert, wenn du also das Beispiel von oben verwenden würdest ständen die Daten in

Code: Alles auswählen

$_POST['own_link_bez']
drin. Du könntest sie dann z.b. so durchlaufen:

Code: Alles auswählen

foreach($_POST['own_link_bez'] as $value)
{
do_something($value);
}

Verfasst: 12.09.2007 13:50
von Nili76
Aber mit

Code: Alles auswählen

$_POST['own_link_bez']
habe ich doch nur jeweils den Wert von own_link_bez in $value stehen.

Bevor ich nun mit $value ein UDATE Table mache, brauche ich ja noch den Wert von own_link.

Logischerweise gehören own_link_bez[1] und own_link[1] zusammen.
Auch wenn in einem von beiden nichts drin steht..

Kann ich eigentlich

Code: Alles auswählen

$_POST['own_link_bez[$i]']

benutzen?

$i könnte ich ja als Zähler durchlaufen lassen....

Ich befürchte nämlich, das sonst bei der foreach anweisung einfach übersprungen wird, falls z.B. der Wert 3 bei einem der beiden nicht gesetzt ist.

Verfasst: 12.09.2007 14:36
von gn#36
Wenn du mehrere Werte hast die als Array eingelesen werden sollen aber voneinander abhängig sind und nicht zwingend alle an den Server übermittelt werden (z.b. Checkboxen werden nur gesendet, wenn sie aktiviert sind) solltest du das wie in meinem ersten Vorschlag machen.
Im Template

Code: Alles auswählen

name="own_link_bez[{own_links.COUNT}]"
bzw.

Code: Alles auswählen

name="andere_abhaengige_variable[{own_links.COUNT}]"
, dann zählst du die Variable COUNT hoch.
Durchlaufen kannst du dann mit

Code: Alles auswählen

foreach($_POST['own_link_bez'] as $key => $value)
{
do_something($value);
do_something_else($_POST['andere_abhaengige_variable'][$key]);
}

Verfasst: 13.09.2007 09:06
von Nili76
Na da habe ich mir ja was tolles einfaleln lassen.... :-?

Es klappt nicht..... Für den Fall, dass du einem kleinen Wicht wie mir noch weiter helfen möchtest:

Ich habe nun in meiner Template das hier stehen:

Code: Alles auswählen

<!-- BEGIN own_links -->
	<tr>
<td class="row1" width="38%"><span class="gensmall">Link {own_links.OWN_LINK_ID}:</span><br /></td>

	<td class="row2" width="20%">
<input type="text" class="post" style="width:200px" name="own_link_bez[{own_links.COUNT}]" size="25" maxlength="255" value="{own_links.OWN_LINK_BEZ}"/><br /></td>
<td class="row3">
<input type="text" class="post" style="width:300px" name="own_link[{own_links.COUNT}]" size="25" maxlength="255" value="{own_links.OWN_LINK}"/><br /></td>

	</tr>
<!-- END own_links -->
Ich bekomme auch alle Felder schön angezeigt. Gar kein Problem.

Nun habe ich in meiner php Datei folgendes geschrieben:

Code: Alles auswählen

$i=1;
foreach($_POST['own_link_bez'] as $key => $value) 
{ 
$sql = "UPDATE phpbb_user_own_links SET 
link_bez = '" . str_replace("\'", "''", $value) ."', 
link = '" . str_replace("\'", "''", $POST['own_link'][$key]) ."'  
WHERE user_id = $user_id AND link_id = $i";
		if ( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not update own_links table', '', __LINE__, __FILE__, $sql);
			}
$i++;
}

Nun werden die Werte von own_links_bez korrekt zurückgeschrieben.

Nur own_link wird geleert. Anscheinend habe ich in dem Code einen Fehler drin, der dafür sorgt, dass der SQL Befehl keinen Wert für das Feld link bekommt...

Verfasst: 13.09.2007 10:38
von gn#36
Kleiner Tippfehler nehme ich an: du hast einmal links und einmal link verwendet.