JOJOManLV Posted February 2, 2015 Report Share Posted February 2, 2015 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> 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. Quote Link to comment Share on other sites More sharing options...
Wuu Posted February 3, 2015 Report Share Posted February 3, 2015 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. Quote Link to comment Share on other sites More sharing options...
JOJOManLV Posted February 3, 2015 Author Report Share Posted February 3, 2015 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? Quote Link to comment Share on other sites More sharing options...
jurchiks Posted February 3, 2015 Report Share Posted February 3, 2015 >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. Quote Link to comment Share on other sites More sharing options...
php newbie Posted February 3, 2015 Report Share Posted February 3, 2015 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); Quote Link to comment Share on other sites More sharing options...
JOJOManLV Posted February 3, 2015 Author Report Share Posted February 3, 2015 (edited) >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 February 3, 2015 by JOJOManLV Quote Link to comment Share on other sites More sharing options...
Kasspars Posted February 3, 2015 Report Share Posted February 3, 2015 (edited) 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 February 3, 2015 by Kasspars Quote Link to comment Share on other sites More sharing options...
JOJOManLV Posted February 3, 2015 Author Report Share Posted February 3, 2015 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. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted February 4, 2015 Report Share Posted February 4, 2015 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(). Quote Link to comment Share on other sites More sharing options...
Kasspars Posted February 4, 2015 Report Share Posted February 4, 2015 (edited) ^ 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 February 4, 2015 by Kasspars Quote Link to comment Share on other sites More sharing options...
Kavacky Posted February 5, 2015 Report Share Posted February 5, 2015 Nav gluži tā, ka viņi pirmie to iedomājās. PS: Kāda starpība, kad izsauc connect? Kam tev jāzina, kad būs pirmais, ja tev ir svarīgi tikai tas, lai viņš vispār būtu? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.