Jump to content
php.lv forumi
knauzers

PHP kalnedārs ar dropdown

Recommended Posts

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 by e-remit

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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]);
}

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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; ?>">&lt;</a> <?php echo $html_title; ?> <a href="?ym=<?php echo $next; ?>">&gt;</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>

 

Share this post


Link to post
Share on other sites

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);

 

Share this post


Link to post
Share on other sites
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 by knauzers

Share this post


Link to post
Share on other sites

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..

 

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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... ;)

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
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...