21. marts 2013 - 11:06Der er
38 kommentarer og 1 løsning
Fejlmelding når jeg prøver at hente menu med denne Ole har skrevet...
Jeg er ny i det her, så hvis det er et tåbeligt spørgsmål, så bær lige over med mig ;)
Først og fremmest ved jeg godt det IKKE er mysqli, men ville gerne bare ha' en succesoplevelse med at få den til at skriv noget ud på min skærm (helst de rigtige data), så må det laves om og mere sikker bagefter.
Ole har skrevet dette i en anden tråd, så jeg prøvede at tampe det ind og køre det med den fejler..
function getMenu() { $sql = 'SELECT * FROM menu ORDER BY parentcategory, id, name'; $res = mysql_query($sql); $menu = array( 'items' => array(), 'parents' => array() ); while ($row=mysql_fetch_assoc($res)) { $menu['items'][$row['id']] = $row; $menu['parents'][$row['parentcategory']][] = $row['id']; } return buildMenu($menu); } function buildMenu($menu, $parent=0) { $arrHTML = array(); $arrHTML[] = '<ul>'; foreach ($menu['parents'][$parent] as $id) { if (!isset($menu['parents'][$id])) { $arrHTML[] = '<li>ID: '.$menu['items'][$id]['id'].' :: Name: '.$menu['items'][$id]['name'].'</li>'; } if (isset($menu['parents'][$id])) { $arrHTML[] = ' <li>'.$menu['items'][$id]['id'].' :: Name: '.$menu['items'][$id]['name']; $arrHTML[] = buildMenu($menu, $id); $arrHTML[] = '</li>'; } } $arrHTML[] = '</ul>'; return implode('', $arrHTML); }
mysql_close($con); ?> <?php echo getMenu() ?>
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\tut\hent_menuer2.php on line 15
Notice: Undefined offset: 0 in C:\xampp\htdocs\tut\hent_menuer2.php on line 24
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\tut\hent_menuer2.php on line 24
Har lavet en menu-tabel med id (int11 auto), name (varchar) og parentcategory (int11) tampet nogle data ind, er der nogen der kan hjælpe mig med at få hul igennem? :)
Hvis linien $con=mysql_connect("localhost","root","password","database"); ellers indeholder de korrekte oplysninger, så burde det virke, og ikke give lige den fejl. Men er du sikker på, at du har oprettet "database" ?
Med det gamle MySQL-API er der ingen tvivl om, at funktionen sparer ret meget ved kun at foretage ét kald til DB'en.
På den anden side afvikler kald med samme prepared statement (men med forskellige værdier), meget hurtigt med MySQLI-API'et. Derfor er forskellen mellem funktionen og DB-kald i en løkke formodentlig ikke nær så stor med MySQLI =)
Nej ok, men som du ved er jeg ny i det her, så jeg følger bare med stille og roligt og suger til mig :)
Den anden dag da du "sparkede" mig i gang http://www.eksperten.dk/spm/978494#reply_8042210 kunne jeg alligevel ikke få den til at loope inden i loopet, men håber jeg alligevel har fanget noget af det du prøver at fortælle/lære mig :)
Fortsæt bare med den, du har gang i her i tråden. Så kan du altid prøve den anden =)
Om koden i den anden tråd skal dog lige siges, at den 'sparsommelige' måde består i at oprette dit statement nummer to én gang - gerne lige efter det første statement.
Inde i den første løkke binder du så parametre på det andet statement - hvorefter du eksekverer dette og henter de nye data. Noget i stil med:
Jeg kan få de her til at køre FØR din function, men prøver jeg queryen inde i functionen fejler den.
$mysqli = new mysqli("localhost", "root", "xxx", "db");
/* Tjek, om der opstod en fejl */ if (mysqli_connect_errno()) { echo 'Der opstod en fejl ved forbindelsen: ' . mysqli_connect_error(); exit(); } $stmt = $mysqli->query('SELECT * FROM menu ORDER BY parentcategory, id, name');
while ($row = $stmt->fetch_object()){ echo $row->name . "<br>"; }
Ja, for din variabel $mysqli er formodentlig erklæret i det globale scope (udenfor funktionen). Så kan den ikke 'ses' indefra funktionen. Åben forbindelsen i funktionen i stedet =)
Så ser den færdige sådan her ud - er det SÅ med SIKKER kode/forbindelse??
<?php function getMenu() { $mysqli = new mysqli("localhost", "root", "mmgmeyer", "democms");
if (mysqli_connect_errno()) { echo 'Der opstod en fejl ved forbindelsen: ' . mysqli_connect_error(); exit(); } $stmt = $mysqli->query('SELECT * FROM menu ORDER BY parentcategory, id, name');
Hovedmunuerne der ikke har undermenuer skriver den fint, men når hovedmenuen har undermenuer lukker den ikke </li> men </ul>, </li> kommer først efter undermenuerne, her er et udskrift:
Hvis du er ved at være der, hvor problemerne er løst, lægger du bare selv et svar og accepterer det, så tråden lukkes. Hverken Erik eller jeg samler point =)
God bedring! Jeg kan anbefaler te - en god portion sukker - og rigeligt med rom. Det er en elendig medicin - men 'fluen' bliver straks en hel del hyggeligere *o)
Hahaha.. tak og tak for rådet :D Men hvorfor fanden vil du slå mig ihjel?.. The kan da ikke være sundt for noget som helst ;)
Ja tak, er lige ved at være der, kunne dog f.eks. godt tænke mig at skifte stylesheet på undermenuerne, altså hvis det er en hovedmenu <ul class"hovedmenu">.. er det en undermenu <ul class"undermenu">, kan bare ikke lure hvor jeg skal putte det ind i dit loop :)
Udover det skal jeg nok ha' nogle flere felter med over til de forskellige links, men det tror jeg godt jeg kan klare :)
Haha.. tror bare du har ret, jeg holder mig også til kaffen, men på den anden side efter nogle få kopper er man nok ikke så sart mere :D
Jeg tror bedst jeg kan li' den med $class, kan godt se den anden er nemmere, men den her lærte mig jo noget bedre ;) og den der "sammentrækning" du laver med den if-else, den er sg da genial, hvorfor gøre det sværere end det er :)
Jeg havde prøvet alt inde i den funktion, hentet en variabel fra db hvor hovedmenu var 1 og lavet den if-else, men INTET virkede og kommer du bare og skriver en lille linie, altså! :)
Og endnu endnu endnu. osv...en gang.. tusind tak igen :)
Den laveste ID, du har i databasen er 1 - og $parent i funktionen er den ID, som den pågældende menu skal lægge sig under. Når $parent er 0, må vi derfor være ude i roden (= 'hovedmenuen')
Jeps, den har jeg luret :) men i databasen lavede jeg et 1 tal når det er en hovedmenu, det var det jeg prøvede at tjekke den op imod uden held :) Men alle de sidespring er jo spild af tid har jeg nu lært, hvorfor gøre det mere besværligt end det er.
Som man siger: Tee trinkt der Wiener nur, wenn er krank ist.
Jeg tror jeg skal ændre strategi på eksperten.dk - sådan noget i retning af at læse og forstå hele spørgsmålet, inden jeg svarer. Sædvanligvis finder jeg eet ømt punkt, og kigger ikke på resten - der er jo også det nemmeste.
Til hr. Meyer, en lille anbefaling: hvis din menu ikke ændrer sig tit, kan du med fordel generere den een gang for alle, og gemme den som tekstfil, eller i et databasefelt. Dermed nedbringes det arbejde, der skal laves for hver sidevisning, mod at du ved ændringer af menuen genererer denne "cache" een gang til.
- og lad mig i den forbindelse udtale de senere så berømte ord:
"Ich bin ein Wiener!" - Ole Bole
Derudover er jeg helt enig med Erik. Har man skrevet et lille CMS til at oprette/rette/slette sider i, kunne man kalde funktionen i slutningen af hver rettelse. Så vil menuen altid være cached i aktuel version
Og ja Ole, den smider jeg ind til sidst i admin-menudelen af cms'et, kan godt se ideen i det Erik kom med der, vi må ha' faaart og spare på kræfterne :D
haha, hold ham endelig fra theen så, jeg har brug for hjælpen ;)
Men seriøst, jeg har haft en super god uge her, syg eller ej, så føler jeg at jeg er kommet rigtigt langt med det her php på så kort tid, det giver sgu da blod på tanden :)
(og JA Erik ved godt jeg skulle ha' gjort det for mange år siden)
.. men havde det jo godt der som Palle alene i ASPverdenen :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.