e-remit Posted January 4, 2019 Report Share Posted January 4, 2019 (edited) Lieta, ko tu nekādi nesaproti ir tas, ka jābūt divām dažādām koda daļām - viena, kas izveido HTML un otra, kas nolasa POST parametrus un tos saglabā. Ja tu paskatītos pārlūka konsolē, redzētu, ka tev POSTā tiek padoti vienādi mainīgie: name=A&name=B&name=C&... ... t.i. mainīgajā POST["name"] ir tikai viena vērtība! Lai tavu risinājumu kaut kā padarītu par funkcionējošu, SELECT nosaukumi ir jādažādo, piemēram: $week .= '<select name="day_' . $day . '" style="background-color:#01A9DB;">'; Pēc tam, lai nolasītu šos datus, tas jādara atsevišķā sadaļā, nevis esošajā ciklā: if (isset($_POST['day_1']) { $sql_parts = []; for ( $day = 1; $day <= $day_count; $day++) { $date = $ym . '-' . $day; $test = isset($_POST['day_' . $day]) ? (int)$_POST['day_' . $day] : null; $sql_parts[] = "('$date', '$test')"; } if ($sql_parts) { $link = mysqli_connect("localhost", "root", "xxx", "yyy"); if ($link === false) { die("Maintenance code #1234."); } $sql = "INSERT INTO dezuranti (Col1, Col2) VALUES " . implode(',', $sql_parts); if(mysqli_query($link, $sql)){ echo "Records were updated successfully."; } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } mysqli_close($link); } } Saku vēlreiz - šim ir jābūt ārpus tava cikla `for ( $day = 1; $day <= $day_count; $day++, $str++)`! Edited January 7, 2019 by e-remit Quote Link to comment Share on other sites More sharing options...
knauzers Posted January 7, 2019 Author Report Share Posted January 7, 2019 On 1/4/2019 at 8:15 PM, e-remit said: Lieta, ko tu nekādi nesaproti ir tas, ka jābūt divām dažādām koda daļām - viena, kas izveido HTML un otra, kas nolasa POST parametrus un tos saglabā. Ja tu paskatītos pārlūka konsolē, redzētu, ka tev POSTā tiek padoti vienādi mainīgie: name=A&name=B&name=C&... ... t.i. mainīgajā POST["name"] ir tikai viena vērtība! Lai tavu risinājumu kaut kā padarītu par funkcionējošu, SELECT nosaukumi ir jādažādo, piemēram: $week .= '<select name="day_' . $day . '" style="background-color:#01A9DB;">'; Pēc tam, lai nolasītu šos datus, tas jādara atsevišķā sadaļā, nevis esošajā ciklā: if (isset('day_1') { $sql_parts = []; for ( $day = 1; $day <= $day_count; $day++) { $date = $ym . '-' . $day; $test = isset($_POST['day_' . $day]) ? (int)$_POST['day_' . $day] : null; $sql_parts[] = "('$date', $test)"; } if ($sql_parts) { $link = mysqli_connect("localhost", "root", "xxx", "yyy"); if ($link === false) { die("Maintenance code #1234."); } $sql = "INSERT INTO dezuranti (Col1, Col2) VALUES " . implode(',', $sql_parts); if(mysqli_query($link, $sql)){ echo "Records were updated successfully."; } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } mysqli_close($link); } } Saku vēlreiz - šim ir jābūt ārpus tava cikla `for ( $day = 1; $day <= $day_count; $day++, $str++)`! Paldies Tev liels. Vari vēl lūdzu paskaidrot šis rindas funkcionalitāti: " $test = isset($_POST['day_' . $day]) ? (int)$_POST['day_' . $day] : null; " Tobiš, kas tiek panākts ar šo rindu? Quote Link to comment Share on other sites More sharing options...
e-remit Posted January 7, 2019 Report Share Posted January 7, 2019 45 minutes ago, knauzers said: Vari vēl lūdzu paskaidrot šis rindas funkcionalitāti: Kuru daļu tieši tu nesaprati? "?:" ir "Ternary Operator" - if/else saīsinājums; isset() pārbauda, vai konkrētais masīva $_POST elements ir uzsetots; (int) nokasto šo elementu uz int, tā izslēdzot iespēju mainīgajā ierakstīt ko citu, izņemot skaitli. Garāk to var uzrakstīt: $test = null; $key = 'day_' . $day; if (isset($_POST[$key])) { $test = intval($_POST[$key]); } Quote Link to comment Share on other sites More sharing options...
knauzers Posted January 8, 2019 Author Report Share Posted January 8, 2019 Lieliski, viss strādā! Mežonīgs paldies! Turpināšu būvdarbus, varbūt vēl ar kādu jautājumu patraucēšu... Quote Link to comment Share on other sites More sharing options...
knauzers Posted January 24, 2019 Author Report Share Posted January 24, 2019 Te nu nākošais jautājums - par dropdown vaule saglabāšanu pēc submit. Izmēģināju dažādus variantus, sagrābstītus pa ārzemju forumiem, taču bez panākumiem. Varbūt ir kādi ieteikumi, kādā virzienā iet? @e-remit Quote Link to comment Share on other sites More sharing options...
e-remit Posted January 24, 2019 Report Share Posted January 24, 2019 @knauzers, bez aktuālā koda nedomājas! Quote Link to comment Share on other sites More sharing options...
knauzers Posted January 24, 2019 Author Report Share Posted January 24, 2019 11 minutes ago, e-remit said: @knauzers, bez aktuālā koda nedomājas! Sorry, kods: <?php // Set your timezone date_default_timezone_set('Europe/Riga'); // Get prev & next month if (isset($_GET['ym'])) { $ym = $_GET['ym']; } else { // This month $ym = date('Y-m'); } // Check format $timestamp = strtotime($ym . '-01'); if ($timestamp === false) { $ym = date('Y-m'); $timestamp = strtotime($ym . '-01'); } // Today $today = date('Y-m-j', time()); // For H3 title $html_title = date('Y / m', $timestamp); // Create prev & next month link mktime(hour,minute,second,month,day,year) $prev = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)-1, 1, date('Y', $timestamp))); $next = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)+1, 1, date('Y', $timestamp))); // You can also use strtotime! // $prev = date('Y-m', strtotime('-1 month', $timestamp)); // $next = date('Y-m', strtotime('+1 month', $timestamp)); // Number of days in the month $day_count = date('t', $timestamp); // 0:Sun 1:Mon 2:Tue ... $str = date('w', mktime(0, 0, 0, date('m', $timestamp), 0, date('Y', $timestamp))); //$str = date('w', $timestamp); // Create Calendar!! $weeks = array(); $week = ''; // Add empty cell $week .= str_repeat('<td></td>', $str); for ( $day = 1; $day <= $day_count; $day++, $str++) { $date = $ym . '-' . $day; if ($today == $date) { $week .= '<td class="today">' . $day; } else { $week .= '<td>' . $day; } $week .= '<br>'; $week .= '<select name="day_' . $day . '" style="background-color:#01A9DB;">'; $week .= '<option value="0">...</option>'; $week .= '<option value="A">A</option>'; $week .= '<option value="B">B</option>'; $week .= '<option value="C">C</option>'; $week .= '<option value="D">D</option>'; $week .= '<option value="E">E</option>'; $week .= '<option value="F">F</option>'; $week .= '</select>'; $week .= '</td>'; // End of the week OR End of the month if ($str % 7 == 6 || $day == $day_count) { if ($day == $day_count) { // Add empty cell $week .= str_repeat('<td></td>', 6 - ($str % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; // Prepare for new week $week = ''; } } // DELETE LOOP if (isset($_POST['day_1'])) { $sql_parts = []; for ( $day = 1; $day <= $day_count; $day++) { $date = $ym . '-' . $day; $test = null; $key = 'day_' . $day; if (isset($_POST[$key])) { $test = $_POST[$key]; } $sql_parts[] = "('$date', '$test')"; } if ($sql_parts) { $link = mysqli_connect("localhost", "root", "xxx", "yyy"); if ($link === false) { die("Maintenance code #1234."); } $implodeArray = implode(',', $sql_parts); $sql = "TRUNCATE TABLE dezuranti"; if (mysqli_query($link, $sql)){ echo ""; } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } mysqli_close($link); } } // INSERT LOOP if (isset($_POST['day_1'])) { $sql_parts = []; for ( $day = 1; $day <= $day_count; $day++) { $date = $ym . '-' . $day; $test = null; $key = 'day_' . $day; if (isset($_POST[$key])) { $test = $_POST[$key]; } $sql_parts[] = "('$date', '$test')"; } if ($sql_parts) { $link = mysqli_connect("localhost", "root", "xxx", "yyy"); if ($link === false) { die("Maintenance code #1234."); } $implodeArray = implode(',', $sql_parts); $sql = "INSERT INTO dezuranti VALUES " .$implodeArray; if (mysqli_query($link, $sql)){ echo "<p> <font color=#01DFA5> <b><i>OK</i></b></font> </p>"; } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } mysqli_close($link); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>TITLE</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet"> <style> .container { font-family: 'Noto Sans', sans-serif; margin-top: 10px; width: auto; } .button { height: 70px; width: 30%; color: black; font-size: 13px; background-color: #A9F5E1; text-align:center; margin-left:600px; } .button:hover { background-color: #01DFA5; color: black; } h3 { margin-bottom: 100px; } th { height: 10px; text-align: center; font-size: 19px; } td { height: 10px; background-color: #A9F5E1; font-style: italic; font-size: 13px; font-weight: bold; } .today { background: orange; } </style> </head> <body style="background-color:#0B4C5F;"> <div class="container"> <h2 style="color:#01DFA5">Nosaukums <a href="?ym=<?php echo $prev; ?>"><</a> <?php echo $html_title; ?> <a href="?ym=<?php echo $next; ?>">></a></h2> <form method="post"> <table class="table table-bordered" > <tr bgcolor="#01DFA5"> <th>Pr</th> <th>Ot</th> <th>Tr</th> <th>Ce</th> <th>Pi</th> <th style="color:red">Se</th> <th style="color:red">Sv</th> </tr> <?php foreach ($weeks as $week) { echo $week; } ?> </table> <input class="button" type="submit" value="Submit!"> </form> </div> </body> </html> Quote Link to comment Share on other sites More sharing options...
e-remit Posted January 24, 2019 Report Share Posted January 24, 2019 Atmetot to, ka kods ir šausmīgs, man smuki saglabājas! Parādi, kāda ir datubāzes struktūru! SHOW CREATE TABLE dezuranti; Iespējams, ka struktūra neatbilst tavam INSERT pieprasījumam! Uzreiz ieteikums - izmet ārā sadaļu, kas sākas ar `// DELETE LOOP`! To tabulu var iztīrīt arī otrajā sadaļā, tajā pašā MySQL sesijā! Un vispār - katru reizi iztīrīt tabulu ar TRUNCATE ir bezjēdzīgs pasākums, jo tad tu nevarēsi neko saglabāt pa vairākiem mēnešiem. Uzliec unikālo atslēgu tai kolonnai, kurā glabājas datums, tad varēsi rakstīt šādi: INSERT INTO dezuranti (datums, vertiba) VALUES ('2019-01-01', 'A') ON DUPLICATE KEY UPDATE vertiba = VALUES(vertiba); Quote Link to comment Share on other sites More sharing options...
knauzers Posted February 28, 2019 Author Report Share Posted February 28, 2019 (edited) On 1/24/2019 at 11:27 PM, e-remit said: Atmetot to, ka kods ir šausmīgs, man smuki saglabājas! Parādi, kāda ir datubāzes struktūru! SHOW CREATE TABLE dezuranti; Iespējams, ka struktūra neatbilst tavam INSERT pieprasījumam! Uzreiz ieteikums - izmet ārā sadaļu, kas sākas ar `// DELETE LOOP`! To tabulu var iztīrīt arī otrajā sadaļā, tajā pašā MySQL sesijā! Un vispār - katru reizi iztīrīt tabulu ar TRUNCATE ir bezjēdzīgs pasākums, jo tad tu nevarēsi neko saglabāt pa vairākiem mēnešiem. Uzliec unikālo atslēgu tai kolonnai, kurā glabājas datums, tad varēsi rakstīt šādi: INSERT INTO dezuranti (datums, vertiba) VALUES ('2019-01-01', 'A') ON DUPLICATE KEY UPDATE vertiba = VALUES(vertiba); Primkārt, paldies par atklātību. Man, šo visu būvējot, uzraiz bija skaidrs, ka diži optimāls šis kods nebūs. :D Par tēmu - mazliet nesaprati. Tabulā viss saglabājas. Mana ideja bija, lai izvēlētie dropdown lauki pēc POST darbības saglabā savas vērtības web lapā. Šobrīd man pēc Submit pogas nospiešanas visi dropdown lauki atkrīt uz defaultajām " ... " vērtībām. Pieņemu, ka šeit kā viens no soļiem ir ieviest Tevis minēto UPDATE funkciju SQL tabulai. Edited February 28, 2019 by knauzers Quote Link to comment Share on other sites More sharing options...
Grey_Wolf Posted February 28, 2019 Report Share Posted February 28, 2019 Spriežot pēc koda.. vispār bezjēdzīgs pasākums.. Pilnīgi nevajadzīgi tiek izmantota datu bāze.. Ja vēlies ĪSLAICĪGI saglabāt datus, saglabā tos sesijās mainīgajos.. nevis datu bāzē.. Ir tā ka otrs lietotājs redzēs cita lietotāja ieliktos datus.. - -KODS IR BEZJĒDZĪGS .. Padomā loģiski ko tavs kods dara!! 1. NODZĒŠ.. datubāzi.. ieraksta kaut ko jaunu .. 2. ielasa datus!! - KĀDUS DATUS?? .. tie jau varbūt ir "Djadja Vaja" dati.. - nekādas garantijas ka lietotāja.. dati... 3. Un ko iegūsti? NEKO !! Kods ir bezjēzīgs.. Quote Link to comment Share on other sites More sharing options...
e-remit Posted February 28, 2019 Report Share Posted February 28, 2019 7 hours ago, knauzers said: Mana ideja bija, lai izvēlētie dropdown lauki pēc POST darbības saglabā savas vērtības web lapā. Vienkāršākais variants pie izvades vajadzīgajai vērtībai pielikt "selected" atribūtu: $week.= '<option value="A">A</option>'; $week.= '<option value="B" selected>B</option>'; $week.= '<option value="C">C</option>'; Protams, atbilstoši jāpārveido kods, lai katru `select` tagu apstrādātu atsevišķi. Quote Link to comment Share on other sites More sharing options...
knauzers Posted March 1, 2019 Author Report Share Posted March 1, 2019 16 hours ago, Grey_Wolf said: Spriežot pēc koda.. vispār bezjēdzīgs pasākums.. Pilnīgi nevajadzīgi tiek izmantota datu bāze.. Ja vēlies ĪSLAICĪGI saglabāt datus, saglabā tos sesijās mainīgajos.. nevis datu bāzē.. Ir tā ka otrs lietotājs redzēs cita lietotāja ieliktos datus.. - -KODS IR BEZJĒDZĪGS .. Padomā loģiski ko tavs kods dara!! 1. NODZĒŠ.. datubāzi.. ieraksta kaut ko jaunu .. 2. ielasa datus!! - KĀDUS DATUS?? .. tie jau varbūt ir "Djadja Vaja" dati.. - nekādas garantijas ka lietotāja.. dati... 3. Un ko iegūsti? NEKO !! Kods ir bezjēzīgs.. Kods ir jēdzīgs tādā ziņā, ka tas ir kalnedārs ar fiksētām dropdown vērtībām, kuras jānosūta uz SQL datubāzi, no kuras savukārt cita aplikācija šos datus lasīs. Es eju soli pa solim, līdz ar to kādā brīdī kāda darbība var šķist (un lielākoties pamatoti) lieka... ;) Quote Link to comment Share on other sites More sharing options...
knauzers Posted March 1, 2019 Author Report Share Posted March 1, 2019 On 1/24/2019 at 11:27 PM, e-remit said: Atmetot to, ka kods ir šausmīgs, man smuki saglabājas! Parādi, kāda ir datubāzes struktūru! SHOW CREATE TABLE dezuranti; Iespējams, ka struktūra neatbilst tavam INSERT pieprasījumam! Uzreiz ieteikums - izmet ārā sadaļu, kas sākas ar `// DELETE LOOP`! To tabulu var iztīrīt arī otrajā sadaļā, tajā pašā MySQL sesijā! Un vispār - katru reizi iztīrīt tabulu ar TRUNCATE ir bezjēdzīgs pasākums, jo tad tu nevarēsi neko saglabāt pa vairākiem mēnešiem. Uzliec unikālo atslēgu tai kolonnai, kurā glabājas datums, tad varēsi rakstīt šādi: INSERT INTO dezuranti (datums, vertiba) VALUES ('2019-01-01', 'A') ON DUPLICATE KEY UPDATE vertiba = VALUES(vertiba); Jautājums, vai DUPLICATE KEY... sadaļu varu kaut kā kombinēt ar implode? Vai arī implode izslēdzam no koda? Quote Link to comment Share on other sites More sharing options...
e-remit Posted March 1, 2019 Report Share Posted March 1, 2019 6 hours ago, knauzers said: Jautājums, vai DUPLICATE KEY... sadaļu varu kaut kā kombinēt ar implode? Šitā? INSERT INTO dezuranti (datums, vertiba) VALUES ('2019-01-01', 'A'), ('2019-01-02', 'B'), ('2019-01-03', 'C'), ('2019-01-04', 'A') ON DUPLICATE KEY UPDATE vertiba = VALUES(vertiba); ...nav problēmu! Quote Link to comment Share on other sites More sharing options...
knauzers Posted April 9, 2019 Author Report Share Posted April 9, 2019 On 3/1/2019 at 11:07 PM, e-remit said: Šitā? INSERT INTO dezuranti (datums, vertiba) VALUES ('2019-01-01', 'A'), ('2019-01-02', 'B'), ('2019-01-03', 'C'), ('2019-01-04', 'A') ON DUPLICATE KEY UPDATE vertiba = VALUES(vertiba); ...nav problēmu! Idejiski jā, šādi! Cik saprotu, ar šo konkrēto kodu es to nepanākšu! :) 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.