webForumDet fria alternativet

Skicka arrayer med POST

16 svar · 1 021 visningar · startad av PiteCarina

PiteCarinaMedlem sedan sep. 200749 inlägg
#1

Hej!
Jag använder mig av "PHP MySQL Shopping Cart Tutorial" från sidan https://www.phpwebcommerce.com och har problem med uppdateringen av kundvagnen. Jag får felmeddelande "Array to string conversion".

I filen cart.php, så finns det ett formulär som innehåller bl.a. dessa rader

<form action="<?php echo $_SERVER['PHP_SELF'] . "?action=update"; ?>" method="post" name="frmCart" id="frmCart">

<input name="hidCartId[]" type="hidden" value="<?php echo $ct_id; ?>">

</form>

I filen cart-function.php, som är inkluderad i cart.php, finns i funktionen uppdateCart() bl.a. denna kod:

$cartId = $_POST['hidCartId'];

Det är ju meningen att $cartId ska vara en array innehållande det som lagts in i arrayen hidCartId, men det blir i stället en sträng med innehållet "Array".

Så jag ser ju att arrayen blir en sträng, som felmeddelandet säger, men jag förstår inte varför? Hur kan/ska man skriva?

Testade även att hämta ut innehållet i $_POST['hidCartID'][1] och fick då ut bokstaven 'r' från strängen "Array".

Jag är rätt så nybörjare med PHP och har aldrig provat att skicka arrayer via formulär.

Tar tacksamt emot hjälp!
PiteCarina

PiteCarinaMedlem sedan sep. 200749 inlägg
#2

Borde kanske tillägga att nedanstående rad ingår i en for-loop, så det hamnar fler än ett värde i arrayen och att de är olika! Rätt så meningslöst annars med en array! :-D

<input name="hidCartId[]" type="hidden" value="<?php echo $ct_id; ?>">

PiteCarinaMedlem sedan sep. 200749 inlägg
#3

Ändrade från POST till GET för att kunna se vad som skickades med efter URL och fick då följande sträng:

txtQty%5B%5D=5&hidCartId%5B%5D=95&hidProductId%5B%5D=47&txtQty%5B%5D=3&hidCartId%5B%5D=94&hidProductId%5B%5D=10&btnUpdate=Update+Cart

txtQty, hidCartId och hidProductId är alla arrayer som skapats i formuläret.

Ser att värderna som de tilldelas stämmer och "%5B%5D" betyder väl [], så de borde väl tolkas som arrayer? Är allt ok så långt?

Görs det fel när innehållet av arrayen/arrayerna ska hämtas?

PiteCarinaMedlem sedan sep. 200749 inlägg
#4

Det verkar kunna vara det här i den inkluderade filen config.php som ställer till det? Ifall det annars ser ok ut?

if (!get_magic_quotes_gpc()) {
if (isset($_POST)) {
foreach ($_POST as $key => $value) {
$_POST[$key] = trim(addslashes($value));
}
}

if (isset($\_GET)) {
	foreach ($\_GET as $key =\> $value) {
		$\_GET\[$key\] = trim(addslashes($value));
	}
}	

}

De tre kodfilerna finns i sin helhet här:

http://www.phpwebcommerce.com/source/cart.php

http://www.phpwebcommerce.com/source/library/cart-functions.php

http://www.phpwebcommerce.com/source/library/config.php

Tar mycket tacksamt emot hjälp!
PiteCarina

PeddaMedlem sedan juni 20004 880 inlägg
#5

Ja, jag har också upptäckt att om man kör trim() på en array så blir den konstig.

Antingen tar du bort trim() delen eller så kollar du om det är en array först och kör bara trim om det inte är en array.

PiteCarinaMedlem sedan sep. 200749 inlägg
#6

Hej Pedda!
Tack för ditt svar!
Jag provade att ändra inne i config.php till så här:

if (!get_magic_quotes_gpc()) {
if (isset($_POST)) {
foreach ($_POST as $key => $value) {
if(is_array($_POST[$key])){
$_POST[$key] = addslashes($value);
}else{
$_POST[$key] = trim(addslashes($value));
}
}
}

if (isset($\_GET)) {
	foreach ($\_GET as $key =\> $value) {
		if(is_array($\_GET\[$key\])){
			$\_GET\[$key\] = addslashes($value); \*\*
		}else{
			$\_GET\[$key\] =  trim(addslashes($value));
		}
	}
}

}

Men det blir tyvärr fortfarande felmeddelandet: "Array to string conversion" för de tre arrayerna, i kodraden markerad med **

colioneMedlem sedan juni 20013 386 inlägg
#7

Du borde byta tänk där, den tutorialen är uppen barligen väldigt _VÄLDIGT_ dålig. Istället för som man bör göra: tabort möjligtvis tillagda slashar frå get/post/cookie så lägger det scriptet till slashar. Magic quotes/addslashes är en _DÅLIG_ skyddsmetod. Vad du istället bör göra är att rensa ur eventuella slashar från indatan samt escapea datan som ska in i databasen med mysql_real_escape_string.
Helst av allt bör du dock ändra till prepared statements.

Ta inte kritiken fel, den är inte riktad mot dig utan mot phpwebcommerce.

PiteCarinaMedlem sedan sep. 200749 inlägg
#8

Hej colione!
Tack för ditt svar! Nej, jag tar absolut inte åt mig av kritiken!
Det känns förstås fel att att försöka få en dålig skyddsmetod att fungera, om inte lösningen är uppenbar.

Så därför bör jag sätta mig in mer i skyddsmetoder och ska kolla upp och tänka på det du föreslog.

/PiteCarina

PiteCarinaMedlem sedan sep. 200749 inlägg
#9

Det fungerar nu med överföringen av arrayer, då jag tog bort användandet av magic quotes och addslashes. Men nu återstår det att få till en bättre skyddsmetod. Återkommer säkert med frågor om det senare.

Tack för all hjälp!
PiteCarina

colioneMedlem sedan juni 20013 386 inlägg
#10

PiteCarina.

En bra funktion för att vara säker på att slashar inte läggs till i dess gpc är följande:

<?php 
if (get_magic_quotes_gpc()) { 
        $in = array(&$_GET, &$_POST, &$_COOKIE); 
        while (list($k,$v) = each($in)) { 
                foreach ($v as $key => $val) { 
                        if (!is_array($val)) { 
                                $in[$k][$key] = stripslashes($val); 
                                continue; 
                        } 
                        $in[] =& $in[$k][$key]; 
                } 
        } 
        unset($in); 
} 
?>

Om du vill kasta dig in i objektorienterade lösningar för prepared statements skulle jag göra en sökning på PDO, både här på wF, google och i PHP-manualen. Vill du däremot köra med mysql_real_escape_string är php-manualen ditt bästa tips. :)

dAEkMedlem sedan feb. 20041 777 inlägg
#11

Fråga: brukar ni ta höjd för att formulärfälten inte skickas i ordning av alla webbläsare?

PeddaMedlem sedan juni 20004 880 inlägg
#12

dAEk skrev:

Fråga: brukar ni ta höjd för att formulärfälten inte skickas i ordning av alla webbläsare?

Hur menar du?
Det spelar ingen roll i vilken ordning värdena skickas.

PiteCarinaMedlem sedan sep. 200749 inlägg
#13

Hej Colione och tack än en gång!
Funktionen kan jag säkert ha nytta av! :-)

Rent spontant så känner jag mer för mysql_real_escape_string, än för prepared statements. Men jag håller på att läsa om "SQL Injections" och annat som rör säkerhet och PHP, så jag ser kanske annorlunda på saken med lite mer "kött på benen"? Har inte provat på att programmera objektorienterat i PHP, men däremot (förstås) i Java.

Jag tar gärna emot tips på aktuella och bra länkar om "PHP-säkerhet"!

Jag förstod tyvärr inte dAEk:s fråga och vad det hade med mitt inlägg att göra?

dAEkMedlem sedan feb. 20041 777 inlägg
#14

Pedda skrev:

Hur menar du?
Det spelar ingen roll i vilken ordning värdena skickas.

Jo, jag menade ungefär som såhär:

säg att vi har ett formulär för att uppdatera ens kundvagn:

<form>
	
	<div>
		Artikel #1.
		<input type="hidden" name="productid[]" value="a">
		<input type="text" name="quantity[]" value="1">
	</div>
	
	<div>
		Artikel #2.
		<input type="hidden" name="productid[]" value="b">
		<input type="text" name="quantity[]" value="2">
	</div>
	
	<div>
		Artikel #3.
		<input type="hidden" name="productid[]" value="c">
		<input type="text" name="quantity[]" value="3">
	</div>
	
</form>

Skickar vi iväg det formuläret finns det inget som säger att fälten kommer i ordning. Värdena för quantity kan alltså komma i ordningen 2, 1, 3 medan product kan komma i rätt följd, dvs a, b, c. Det finns inget som kopplar dem samman.

Vad jag vet finns det inget i specen som säger att formulärfälten skickas i samma ordning som de förekommer i html-koden. Vet att äldre webbläsare inte alltid skickar fälten i ordning även om de gör det ibland (för det mesta?). Jag kan inte säga att jag med säkerhet vet hur det funkar idag, troligen skickar de flesta moderna webbläsare fälten i "rätt" ordning eftersom man sällan hör om folk som har problem med det här. :)

Kort och gott: det kan bli galet fel för äldre webbläsare och det var därför jag undrade jag om ni brukar ta höjd för detta fenomen.

PiteCarina,

min fråga var bara en fundering från min sida. Eftersom du markerat tråden som löst tänkte jag att jag kunde ställa min fråga här eftersom rubriken var så passande. :)

PiteCarinaMedlem sedan sep. 200749 inlägg
#15

Hej dAEk!
Ja, då förstår jag din fråga bättre, men kan tyvärr inte ge dig ett svar.

Däremot så borde det nog inte vara något problem med detta i koden som jag använder mig av, eftersom det sker i en for-loop?

for ($i = 0; $i < $numItem; $i++) {
.
.
<input name="txtQty[]" type="text" id="txtQty[]" size="5" value="<?php echo $ct_qty; ?>" class="box" onKeyUp="checkNumber(this);">
<input name="hidCartId[]" type="hidden" value="<?php echo $ct_id; ?>">
<input name="hidProductId[]" type="hidden" value="<?php echo $pd_id; ?>">
.
.
}

dAEkMedlem sedan feb. 20041 777 inlägg
#16

Halloj. :)

Det for-loopen gör är att skriva fälten i ordning i html-koden, för webbläsaren är det samma sak som om man hade hårdkodat fält efter fält manuellt. Så det är ingen skillnad alls, tyvärr.

För att komma runt problemet kan man göra name-attributeen för formulärfälten unika genom att använda en loop ungefär som du gör. Dvs fälten får namn i stil med txtQty_1, txtQty_2 etc eller txtQty[1], txtQty[2] etc.

Det innebär lite merjobb på serversidan dock.

PiteCarinaMedlem sedan sep. 200749 inlägg
#17

Hej igen! :-)
Ja, jag kom precis att tänka på det, att det gör nog ingen skillnad!
Har som jag skrev i inledningen, aldrig skickat arrayer med formulär tidigare.

Tack för att du uppmärksammade mig på detta problem! :-)

/PiteCarina

Genererad på 403 ms · cache AV · v20260730165559-full.f96bc7eb