webForumDet fria alternativet

Problem med en PDO query

17 svar · 1 408 visningar · startad av grennfox

grennfoxMedlem sedan feb. 2010191 inlägg
#1

Hallå, jag har absolut ingen aning vad som kan vara fel, då alla andra funktioner funkar fint, även dom andra querys jag använder på samma satt, fast mot en annan databas tabell.

Men så här ser iallafall koden ut:

function getmain(){
	global $db;
	$main = $db->query("SELECT * FROM w_home");
	$main->execute();
	$home = $main->fetchAll();
	//var_dump($main);
	echo $home['main'];
	//return $home;
	
}

jag får ett error där det står att "main" är undefined index.
Jag har slängt in ett echo direkt i functionen just nu då jag har suttit och felsökt ett tag nu.

Och jag har kollat upp mot databasen, det finns en rad där som heter main. men av något anledning så vill just inte denna funka. Men jag förstår inte vad jag har gjort för fel.

cascaMedlem sedan feb. 20003 262 inlägg
#2

Hur ser var_dump($home); ut?

grennfoxMedlem sedan feb. 2010191 inlägg
#3

den ser ut som så här:

array(1) { [0]=> array(8) { ["main"]=> string(6) "hejsan" [0]=> string(6) "hejsan" ["sub1"]=> string(0) "" [1]=> string(0) "" ["sub2"]=> string(0) "" [2]=> string(0) "" ["sub3"]=> string(0) "" [3]=> string(0) "" } }
voigtann1Medlem sedan juni 20018 810 inlägg
#4

skall inte $home vara:

$home = $main->fetchAll()[0];

?

cascaMedlem sedan feb. 20003 262 inlägg
#5

Undefined index betyder ju att $home inte har något index med nyckeln main. Och kollar du på outputen så ser du att strukturen är uppbyggd så att du accessar värdet via $home[0]['main'].

grennfoxMedlem sedan feb. 2010191 inlägg
#6

varför [0] på slutet ?? tar den inte bara ut den först positionen då? då jag kommer att använda alla som finns i den tabellen. men det vill inte funka alls :P

voigtann1Medlem sedan juni 20018 810 inlägg
#7

grennfox skrev:

varför [0] på slutet ?? tar den inte bara ut den först positionen då? då jag kommer att använda alla som finns i den tabellen. men det vill inte funka alls :P

det är den första raden i din träff skulle jag gissa på, eftersom du ha en array av träffar.

grennfoxMedlem sedan feb. 2010191 inlägg
#8

casca skrev:

Undefined index betyder ju att $home inte har något index med nyckeln main. Och kollar du på outputen så ser du att strukturen är uppbyggd så att du accessar värdet via $home[0]['main'].

A jag såg det nu, men det var endå skumt att det blir så att den ligger där. Måste blivit något skumt när jag satte upp databasen :S

Testade även nu och det funkade, men jag fattar inte varför den [0] har hamnat där alltså :P

cascaMedlem sedan feb. 20003 262 inlägg
#9

grennfox skrev:

A jag såg det nu, men det var endå skumt att det blir så att den ligger där. Måste blivit något skumt när jag satte upp databasen :S

Du får väl ut samtliga rader, eftersom du använder dig av fetchAll(), men eftersom det bara finns ett resultat så kommer det? Men använd foreach($home as $row) så kan du printa $row['main'], och behöver inte tänka på hur många rader som kan komma.

grennfoxMedlem sedan feb. 2010191 inlägg
#10

casca skrev:

Du får väl ut samtliga rader, eftersom du använder dig av fetchAll(), men eftersom det bara finns ett resultat så kommer det? Men använd foreach($home as $row) så kan du printa $row['main'], och behöver inte tänka på hur många rader som kan komma.

Jo det är sant, men hur gör jag då om jag vill returnera ut te,x $row['main'] och $row['sub1']?

eller räcker det om man skriver typ så här:

foreach($home as $row]{
return $row
}
echo $row['main']
echo $row['sub1']
grennfoxMedlem sedan feb. 2010191 inlägg
#11

fast jag såg det nu när jag såg koden att det lär inte funka

voigtann1Medlem sedan juni 20018 810 inlägg
#12
function getmain(){
    global $db;
    $main = $db->query("SELECT * FROM w_home");
    $main->execute();
    $home = $main->fetchAll();
    return $home[0];
}

eller

function getmain(){
    global $db;
    $main = $db->query("SELECT * FROM w_home");
    $main->execute();
    $home = $main->fetchAll()[0];
    return $home;
}

borde räcka, rätt onödigt att göra en foreach om du ändå vet att du skall hämta ut första positionen (i min värd så är båda kod exemplen exakt samma sak, men kanske inte i PHP).

om du skall använda det utanför typ:

$test = getmain();

echo $test['main'];
cascaMedlem sedan feb. 20003 262 inlägg
#13

Alltså, om syftet är att bara hämta första raden - varför inte använda sig av fetchColumn() då som gör precis det? Och returnera raden direkt.

function getmain(){
    global $db;
    $main = $db->query("SELECT * FROM w_home");
    $main->execute();
    $home = $main->fetchColumn();
    return $home;
}
grennfoxMedlem sedan feb. 2010191 inlägg
#14

får tacka för all hjälp, men det fick bli denna lösning på det hela, då jag behöver få ut alla kolumner i ett senare skede, så det är nog en liten blandning på alla svar jag har fått här :)
Så här blev koden iallafall:

function getmain(){
	global $db;
	$main = $db->query("SELECT * FROM w_home");
	$main->execute();
	foreach ($main as $home) {
		return $home;
	}	
}

$home = getmain();
echo $home['main'];
voigtann1Medlem sedan juni 20018 810 inlägg
#15

grennfox skrev:

får tacka för all hjälp, men det fick bli denna lösning på det hela, då jag behöver få ut alla kolumner i ett senare skede, så det är nog en liten blandning på alla svar jag har fått här :)
Så här blev koden iallafall:

function getmain(){
	global $db;
	$main = $db->query("SELECT * FROM w_home");
	$main->execute();
	foreach ($main as $home) {
		return $home;
	}	
}

$home = getmain();
echo $home['main'];

få ursäkta mig men det ser verkligen inte vackert ut

grennfoxMedlem sedan feb. 2010191 inlägg
#16

voigtann1 skrev:

få ursäkta mig men det ser verkligen inte vackert ut

Hehe a nej det är nog sant, men som sagt är fortfarande relativt ny på php, så jag jobbar på det. försöker mest att lära mig hur man skriver allt nu så man faktiskt kan skriva saker. Sen snyggheten och hur man kan lösa det smartare osv kommer förhoppningsvis på tiden :)

prplxrMedlem sedan juni 2012557 inlägg
#17

Jag vill slänga in en liten kommentar här. När jag gör som grennfox ville göra i sitt första inlägg så använder jag mig av fetch() istället för fetchAll(). Då får man bara första raden och jag, personligen, tycker att det ser snyggare ut.

Dessutom borde väl inte funktionen skriva ut resultatet? Borde den inte returnera det?

Vidare är det rekommenderat att man bara hämtar ut de fält man behöver från tabellen (något jag är expert på att inte göra, jag vet).

function getmain(){
	global $db;
	$main = $db->query("SELECT main FROM w_home");
	$main->execute();
	$home = $main->fetch();
	return $home['main'];	
}

echo getmain();
voigtann1Medlem sedan juni 20018 810 inlägg
#18
SELECT main FROM w_home limit 1

är väl den bättre SQL frågan då istället för att hämta alla rader i w_home om man bara är intresserad över den första oavsett.

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