Jump to content
php.lv forumi

[PHP]Multi-dimension Dropdown izvēle.


JOJOManLV

Recommended Posts

Sveiki.

Gribējos painteresēties pie masteriem par šo lietu ko ierakstīju tēmas nosaukumā.

 

Palielam eošais kods izskatās šādi.

function optionlistBuild($root, $add){
	global $con_link;
	$query = mysqli_query($con_link, "SELECT * FROM `pages_new` WHERE `master` = '$root'")or die(mysqli_error($con_link));
	$kaja = "";
	if(($root == '0') && ($add == '0')){
		while($data = mysqli_fetch_assoc($query)){
			$kaja .= "<option value='".$data['id']."'>".$data['name']."</option>";
			$kaja .= optionlistBuild($data['id']);
		}
	}
	if($root !== '0'){
		if($add == '1'){
			while($data = mysqli_fetch_assoc($query)){
				$kaja .= "<option value='".$data['id']."'>   |-- ".$data['name']."</option>";
			}
		}else{
			while($data = mysqli_fetch_assoc($query)){
				$kaja .= "<option value='".$data['id']."'> |- ".$data['name'];
				$kaja .= "</option>".optionlistBuild($data['id'], '1');
			}
		}
		
	}
	return $kaja;
}

un ārā sanāk kaut kas šāds

 

protams attiecīgi funkcija izvādās iekš <select></select>

 

xbehc08gtrgk36tarz.png

Manu problēmu padara sarežģitu iemesls ka vajadzīgs reszultāts iekš <select> tagiem attiecīgi kā redzams lai var atšķirt apakšlīmeņus.

 

Taču īsti kaut kā neliekas pareizi, jo īstenībā vēlos ar bezgalīgu iespēju attēlot rezultātus.

Šīnī brīdi ir tikai 3 līmeņi

Un vai iespējams rezultātu izdot no funkcijas vienā lielā masīvā? Ar domu ka šajā funkcijā nav nekādu HTML formatējumu un attiecīgi es viņu varu pielāgot gan <select> tagiem, gan lapas navigācija iekš meņu.

 

Ja kādam ir kāds savādāks paņēmiens droši padalās idejās.

 

Paldies.

 

Link to comment
Share on other sites

Pēc mana uzskata, tava ideja par funkcija izveidošanu nav pareiza. Kur nu vel global izmantošana.

 

Izveido multi dimensiālu array pirms funkcijas un pašā funkcija apstrādā, tikai array. Nevis veido MySql izsaukumus. Tādā veidā funkcijai būs lielāks pielietojums un nebūs jāuztraucas, vai pie funkcijas izsaukšanas MySql ir pieslēdzies.

Link to comment
Share on other sites

Pēc mana uzskata, tava ideja par funkcija izveidošanu nav pareiza. Kur nu vel global izmantošana.

 

Izveido multi dimensiālu array pirms funkcijas un pašā funkcija apstrādā, tikai array. Nevis veido MySql izsaukumus. Tādā veidā funkcijai būs lielāks pielietojums un nebūs jāuztraucas, vai pie funkcijas izsaukšanas MySql ir pieslēdzies.

 Da labi? Es jau gan tikai mācos, bet tu jau mani biedē... :D

 

Global izmantoju jo neiznu normālāku veidu kā padod datus uz funkciju prieks queryija.(nevēlos katrā funkcijā veidot ekstra parametru, vienkārši lai paodotu datus), Kā tad īsti sanāk pareizi? Jo dati par SQL tiek galbāti atsevišķā failā... Idejsiki ir config.php kurā inkluudoju function.php Un tad attiecīgi visu kur vajaga inkluudoju tikai config.php

 

Un kas vainas manai ideja par funkciju?

Link to comment
Share on other sites

>nevēlos katrā funkcijā veidot ekstra parametru, vienkārši lai paodotu datus

Slikti, ka nevēlies, jo tas ir pareizais risinājums. Ja funkcijai vajag kaut kādus datus, tos jāpadod vai nu caur parametriem, vai, ja tā ir objekta metode, tad vēl objekta konstruktorā vai setteros var. Bet ar globālajiem PHP ir baigās auzas un man pa 5+ gadiem reāli vēl nav nācies sastapties ar kodu, kurā globāli variabļi tiešām būtu labākais variants.

Link to comment
Share on other sites

function optionlistBuild($root, $level){
        global $con_link;
        $query = mysqli_query($con_link, "SELECT * FROM `pages_new` WHERE `master` = '$root'")or die(mysqli_error($con_link));
        $kaja = "";

        while($data = mysqli_fetch_assoc($query)){

            $a = array_fill(1, $level, '  ');

            $kaja .= "<option value='".$data['id']."'>".implode('',$a).'|-'.$data['name']."</option>";
            $kaja .= $this->optionlistBuild($data['id'], $level+1);
        }

        return $kaja;
    }

un izsauc:

optionlistBuild('0', 1);
Link to comment
Share on other sites

>nevēlos katrā funkcijā veidot ekstra parametru, vienkārši lai paodotu datus

Slikti, ka nevēlies, jo tas ir pareizais risinājums. Ja funkcijai vajag kaut kādus datus, tos jāpadod vai nu caur parametriem, vai, ja tā ir objekta metode, tad vēl objekta konstruktorā vai setteros var. Bet ar globālajiem PHP ir baigās auzas un man pa 5+ gadiem reāli vēl nav nācies sastapties ar kodu, kurā globāli variabļi tiešām būtu labākais variants.

 

Es nestrīdos, itkā kādu laiciņu tā darīju taču likās galīgi nepareizi, ka katrā funkcijā kurā nepieciešamība pēc pieslēgšanās DB es uz funkciju padodu ne tikai datus bet arī mana variantā $con_link.

 

Bet vai tiešām tas es savu konekciju ar DB veidoju pareizi? Vai nevajag viņu veidot sāvādāk, varbūt ir kādas idejas kā aptuveni tas varētu izskatīties?

 

jo man ir config failā

<?php
$db_host = "localhost";
$db_user = "user";
$db_pass = "pass";
$db_table = "db";

$con_link = mysqli_connect($db_host, $db_user, $db_pass, $db_table);
mysqli_set_charset($con_link, "utf8");

include("function.php");

?>

Attiecīgi zem viņa inkludoju function failu.

 

Līdz šim itkā funkcijās ar tiem GLOBAL liku un nav problēmas piekļūt mainīgajam.

un ķipa ja man ir funkcija

adddatatoDB($datikasietuzdb){
   global $con_link;
   // daram velkl kaut ko
   $query = mysqli_query($con_link, "INSERT Blabla'")or die(mysqli_error($con_link));
}

Kā jau redzējāt augšējā piemērā kā to daru..

 

Tad laikam pareizāk būtu šādi ja?

adddatatoDB($con_link, $datikasietuzdb){
   // daram velkl kaut ko
   $query = mysqli_query($con_link, "INSERT Blabla'")or die(mysqli_error($con_link));
}

Tāpēc jau esmu šeit lai no pieredzējušajiem mācītos kā tad ir pareizāk.

 

Laikam lieki piebilst ka neizmantoju OOP kas laikam ir slikti. Bet pirms tā riktīgi ķerties pie OOP gribēju ar pamatiem tikt galā.

Edited by JOJOManLV
Link to comment
Share on other sites

Par to globālo $con_link vari neuztraukties, nekas slikts tas nav. Vienkārši daži te kā ierauga global tā sāk vaimanāt. Konkrētajā gadījumā tas nekas slikts nav.

Ja tu šo kodu taisītu kā bibliotēku, kuru izmantotu citos projektos, tad globālais mainīgais var novest pie tā, ka citā kodā arī varētu būt tāds pats mainīgai $con_link un tad būs ļoti grūti atrast gļuku

 

Ja gribi, tikt vaļā no mainīgā, tad vari uztaisīt funkciju get_conn, kur atgriež $con_link globālo. Bet tā pat no globālā šajā gadījumā netiksi vaļā. Vienīgi nevajadzēs visās funkcijās rakstīt global $con_link.

Varēsi uzreiz rakstīt mysqli_query(get_conn(), "SELECT......");

 

 

Vēl variants ir uztaisīt klasi. Šajā gadījumā būsi ticis vaļā no globālā $con_link

class DB {
    private static $con_link;

    public static function connect() {
        self::$con_link = mysql_connect(....);
    }

    public static function get_conn() {
        return self::$con_link;
    }
}

Tagad visur, kur izpildīsi query raksti šādi (Neaizmirsti aplikācijas sākumā palaist DB::connect(), lai izveidojas db pieslēgums)

mysqli_query(DB::get_conn(), "SELECT......");

 

 

 

Nākošais loģiskais solis, būtu mysql_query pārnest uz DB klasi metodē DB::query( 'SELECT....' );

 

Bet to tu pats izdomāsi kā :)

Edited by Kasspars
Link to comment
Share on other sites

function optionlistBuild($root, $level){
        global $con_link;
        $query = mysqli_query($con_link, "SELECT * FROM `pages_new` WHERE `master` = '$root'")or die(mysqli_error($con_link));
        $kaja = "";

        while($data = mysqli_fetch_assoc($query)){

            $a = array_fill(1, $level, '  ');

            $kaja .= "<option value='".$data['id']."'>".implode('',$a).'|-'.$data['name']."</option>";
            $kaja .= $this->optionlistBuild($data['id'], $level+1);
        }

        return $kaja;
    }

un izsauc:

optionlistBuild('0', 1);

 Nostrādāja gandrīz ideāli, nedaudz pielaboju un sanāca tas ko man vajaga. Protams nav tas pat optimālakāis variants, bet manam mērķim būs pietiekami.

Link to comment
Share on other sites

Lai nebūtu jāizmanto globāls $con_link:

function getDbCon()
{
    static $con = null;
    
    if ($con === null)
    {
        $db_host = "localhost";
        $db_user = "user";
        $db_pass = "pass";
        $db_table = "db";
        
        $con = mysqli_connect($db_host, $db_user, $db_pass, $db_table);
        mysqli_set_charset($con, "utf8");
    }
    
    return $con;
}

Iemet šo savā config.php vai kur gribi, un lieto.

 

Kasspars neizmanto lazy loading, viņa versijā obligāti papriekš jāizsauc connect().

Link to comment
Share on other sites

^ Manuprāt labāk pašam nokontrolēt kad izsaukt connect. Tavā gadījumā īsti nezini, kad būs pirmais getDbConn.

 

Nezināju pār šito fīču, kad funkcijā var nodefinēt static variabli. Baigā aizdoma, ka paši php autori nebija paredzējuši šādu fīču :D

 

Tomēr zināja, rekur aprakstīts par šo iespēju

http://php.net/manual/en/language.variables.scope.php

Edited by Kasspars
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...