12. november 2003 - 10:25Der er
58 kommentarer og 1 løsning
PHP - MySql funktion
Hej
Jeg har en opgave som jeg havde tænkt at løse med PHP og MySql (som jeg langt om længe har fået sat mig lidt ind i)
Jeg skal lave nogle stamtavler og havde tænkt mig at gøre som følgende:
Tabel: HUND Felter: ID (tekst som jeg selv indtaster) Navn Far ID Mor ID
Min PHP skal så i en tabel indsætte far/mor farfar/farmor morfar/mormor osv. (4 generationer) udfra et id som jeg angiver.
Tabellen består af 4 kolonner og 16 rækker
hvor kolonne 1 har 2 felter (far og mor) kolonne 2 har 4 felter (farfar, farmor, morfar, mormor) kolonne 3 har 8 felter etc. kolonne 4 har 16 felter etc.
lavet med rowspan...
Kan jeg med PHP gøre dette?
Det er jo nok noget med at for hver hund der bliver indsat skal jeg gemme den værdi i en variabel (et eksempel på den kunne være godt) - men spørgsmålet er om jeg kan fedte det ind i tabellen
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
function hent($hund) { for ($i=0;$i<count($hund);$i++) { foreach ($hund[$i] as $navn) { $res = mysql_query("select far, mor from hunde where navn='$navn'"); $row[] = mysql_fetch_assoc($res); } } return $row; } ?>
Den viser så kun hunden og den forældre og bedsteforældre, men det kan du selv bestemme. Så ændrer du bare $antal til 4, hvis du vil have 4 generationer. Og det var så et svar :o)
Jeg har ændret tabelstrukturen ift. dit eksempel og det har selvfølgelig den ulempe at to hunde ikke må have samme navn. Det var mest af bekvemmelighedsgrunde, så jeg slap for at taste de sidste 8 hunde ind i mit lille eksempel. Men det kan nemt laves om, så det passer med din struktur.
Jeg har ændret tabelstrukturen ift. dit eksempel og det har selvfølgelig den ulempe at to hunde ikke må have samme navn. Det var mest af bekvemmelighedsgrunde, så jeg slap for at taste de sidste 8 hunde ind i mit lille eksempel. Men det kan nemt laves om, så det passer med din struktur.
Det ser spændende ud detox - men jeg når desværre nok ikke at kigge på det de første par dage - kunne du måske lave små korte forklaringer til koden, da jeg stadig er lidt våd bag ørerne mht. PHP vil jeg gerne vide hvad jeg laver...?
Jeg har rettet det til så det virker med dit forslag til tabelstruktur (navn, far(id), mor(id)). Det viste sig at være en smule mere vanskelligt end jeg havde troet, men her er det med kommentarer.
<? /******************************************* DROP TABLE IF EXISTS `hunde`; CREATE TABLE `hunde` ( `id` smallint(5) unsigned NOT NULL auto_increment, `navn` varchar(20) NOT NULL default '', `far` smallint(5) unsigned NOT NULL default '0', `mor` smallint(5) unsigned NOT NULL default '0', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=16 ;
# # Data dump for tabellen `hunde` #
INSERT INTO `hunde` VALUES (1, 'fido', 2, 3); INSERT INTO `hunde` VALUES (2, 'vaks', 4, 7); INSERT INTO `hunde` VALUES (3, 'tulle', 5, 6); INSERT INTO `hunde` VALUES (4, 'fax', 8, 9); INSERT INTO `hunde` VALUES (5, 'vagabonden', 10, 11); INSERT INTO `hunde` VALUES (6, 'lady', 12, 13); INSERT INTO `hunde` VALUES (7, 'lula', 14, 15); INSERT INTO `hunde` VALUES (8, 'banditten', 0, 0); INSERT INTO `hunde` VALUES (9, 'elisa', 0, 0); INSERT INTO `hunde` VALUES (10, 'pluto', 0, 0); INSERT INTO `hunde` VALUES (11, 'smukke', 0, 0); INSERT INTO `hunde` VALUES (12, 'scotty', 0, 0); INSERT INTO `hunde` VALUES (13, 'blue', 0, 0); INSERT INTO `hunde` VALUES (14, 'bamse', 0, 0); INSERT INTO `hunde` VALUES (15, 'mamse', 0, 0); **************************************************************/
require 'db.php';// Forbindelse til database $antal = 3;// Antal generationer $hund[0]['id'] = 1;// valgt hunds ID // Alle '$out' sætningerne indsamler det der skal udskrives i en string $out = "<table border='1'><tr><td colspan='".pow(2, $antal)."' align='center'>";// pow() udregner colspan udfra 2^antal generationer // Henter navn på hunden med det valgte ID $navn = mysql_result(mysql_query("select navn from hunde where id=".$hund[0]['id']),0); $out .= $navn."</td></tr>"; // Gennemløber det valgte antal generationer for ($i=1;$i<=$antal;$i++) { $hund = hent($hund);// Kalder funktionen hent() $out .= "<tr>"; // $hund er et multidimensionelt array af formen $hund[0]['far'], så her gennemløbes det første af de to array's foreach ($hund as $id) { $navn = navn($id);// Kalder funktionen navn() $out .= "<td colspan='".pow(2, $antal-$i)."' align='center'>" . $navn[0] . "</td> <td colspan='".pow(2, $antal-$i)."' align='center'>" . $navn[1] . "</td>"; } $out .= "</tr>"; } $out .= "</table>"; echo $out;
function hent($hund) {// Henter id's (far & mor) på hundene i arrayet for ($i=0;$i<count($hund);$i++) { foreach ($hund[$i] as $id) { $res = mysql_query("select far, mor from hunde where id=$id"); $row[] = mysql_fetch_assoc($res); } } return $row; }//function hent slut
function navn($id) {// Henter navne på far og mor $res = mysql_query("select navn from hunde where id=".$id['far']." OR id=".$id['mor']) or die(mysql_error()); while ($row = mysql_fetch_row($res)) { $navn[] = $row[0]; } return $navn; }//function navn slut ?>
Nu har jeg rodet en del med VBA og der har men jo mulighed for debugge og dermed se værdien efterhånden som koden gennemløbes - kan man noget tilsvarende med PHP?
Lige umiddelbart hva har jeg så når din kode er færdig - et array jeg kan smide i min tabel elller???
Mht til debugning, så viser php jo flere forskellige fejltyper og på hvilke linier de forekommer. Derudover kan det være praktisk at udskrive nogle værdier undervejs, for at se om de indeholder det man forventer. Fx, hvis man har en query med variabler, kan man midlertidigt erstatte mysql_query() med print(). I det eksempel jeg har lavet, lægges den færdige html-kode i en variabel ($out), der udskrives sidst i scriptet. Du kan selvfølgelig tilføje dine egne styles i de forskellige tags (fx <table> <tr> <td>), men resultatet er en færdig tabel.
require 'db.php';// Forbindelse til database $antal = 3;// Antal generationer $hund[0]['id'] = 1;// valgt hunds ID
$dog = array(); $item = mysql_result(mysql_query("select navn from hunde where id=".$hund[0]['id']),0); $dog[1] = $item; for ($i=1;$i<=$antal;$i++) { $hund = hent($hund);// Kalder funktionen hent() foreach ($hund as $id) { $navne = navn($id);// Kalder funktionen navn() foreach ($navne as $item) { $dog[] = $item; } } } // // Her kan du indsætte din tabel navnene ligger så i $dog[1],$dog[2],$dog[3],... //
//FUNKTIONER function hent($hund) {// Henter id's (far & mor) på hundene i arrayet for ($i=0;$i<count($hund);$i++) { foreach ($hund[$i] as $id) { $res = mysql_query("select far, mor from hunde where id=$id"); $row[] = mysql_fetch_assoc($res); } } return $row; }//function hent slut
function navn($id) {// Henter navne på far og mor $res = mysql_query("select navn from hunde where id=".$id['far']." OR id=".$id['mor']) or die(mysql_error()); while ($row = mysql_fetch_row($res)) { $navn[] = $row[0]; } return $navn; }//function navn slut ?>
function navn($id) {// Henter navne på far og mor $res = mysql_query("select navn from hunde where id=".$id['far']." OR id=".$id['mor']) or die(mysql_error()); while ($row = mysql_fetch_row($res)) { $navn[] = $row[0]; } return $navn; }//function navn slut ?>
Ja, det skal nok blive godt. Du skal lige fjerne: '// // Her kan du indsætte din tabel nameene ligger så i $dog[1],$dog[2],$dog[3],... //'
Og, ja der skulle ikke være det store besvær med at hente yderligere data, som fx tekst og sti til billede. Du kan tilføje de felter i funktionen navn. De skal så dog lægges i et multidimensionelt array i stil med den anden funktion.
jo jo - men det er jeg vist for træt til nu ;O)))))
Tusind tak for hjælpen - hvis jeg får brug for yderligere hjælp opretter jeg et nyt spørgsmål - og venligst sig til hvis jeg på nogen måde kan henvise til dig på disse stamtavler?
Ok, velbekommen :o) Jeg har lavet et eksempel, hvor den henter navn, sti, og tekst og ligger i hver deres array, så skulle det vidst være til at gå til ;o)
<?
require 'db.php';// Forbindelse til database $antal = 4;// Antal generationer $hund[0]['id'] = 1;// valgt hunds ID
function navn($id) {// Henter navne på far og mor $res = mysql_query("select navn, sti, tekst from hunde where id=".$id['far']." OR id=".$id['mor']) or die(mysql_error()); while ($row = mysql_fetch_assoc($res)) { $data['navn'][] = $row['navn']; $data['sti'][] = $row['sti']; $data['tekst'][] = $row['tekst']; } return $data; }//function navn slut ?>
....... function name($id) {// Henter name på sire og dam $res = mysql_query("select name, img_path, hipp_score from hunde where id=".$id['sire']." OR id=".$id['dam']) or die(mysql_error()); while ($row = mysql_fetch_assoc($res)) { $data['name'][] = $row['name']; $data['img_path'][] = $row['img_path']; $data['hipp_score'][] = $row['hipp_score']; } return $data; Burde dette ikke virke???
problemet var, at nogle felter i hipp_score var tomme - det kunne den åbenbart ikke lide - nu har jeg indsat en - i de tomme og så virker det - kan man komme uden om det?
det var såmænd fordi en del af dem har ikke hverken far eller mor (eller det har de jo jeg kender dem bare ikke *LOL*)
Jeg oprette derfor en dummie nr. 9999 med teks n/a
Det eneste er så hvis den ukendt ikke er i sidste række men f.eks. i anden sidste række så bliver sidste række tom - den kan ligesom ikke hente den samme hund som forældre - men det går nok.....
Jeg har brug for at få id'en med på lige line med name og hipp_score og har forsøgt men det virker ikke - her er mit forsøg - kan du hjælpe igen igen igen:
Som du ser skal jeg bruge id til at hente img_path og navn i en anden funktion hvordan gør jeg det?
Kom lige til at tænke på om jeg egentlig kunne sende img_paht og name videre til den næste funktion i min <a href ????? så skal jeg ikke hente data igen?
Men burde jeg ikke kunne sende værdien direkte - det må da alt andet lige være det bedste - skal bare lige finde ud af hvordan jeg sender flere værdier.....
altså jeg har et pop-up vindue som viser billede og navn på hunden. Jeg har fået det til at virke ved at sende de enkelte hundes ID videre til næste funktion sådan her:
Men så tænkte jeg - vi har jo lige trukket både navn og img_path ud så hvorfor ikke bare sende den til show_ped_pic direkte? Men jeg ved ikke hvordan jeg sætter det ind i ovenstående - hvis man altså kan?
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.