Професионална програма
Loading...
BobbyKejev avatar BobbyKejev 12 Точки

Задачите от първата PHP WEB DEVELOPMENT лекция.

Здравейте,

Ето това са моите варианти на задачите от първата лекция Introduction to PHP and Apache Web Server. Не съм използвал конзолата, защото не съм и фен и направо съм ги писал за web.

/* 4. Largest Number Again
Having in mind the considerations in the Task 3, find the largest number, but this time the input numbers might contain negatives. */

$numArr = [3, 7, -4, 5];
$stringNumbers = implode(', ', $stringNumbers);

echo "The greatest number from numbers $stringNumbers is: " . max($numArr) . '<br />';

$numArr = [-3, -2, -17, -33, -1];
$stringNumbers = implode(', ', $numArr);

echo "The greatest number from numbers $stringNumbers is: " . max($numArr);

/* 5. Count Letters
You will receive a single line from the standard input containing a word (or at least a set or characters). 
You need to print on the standard input how many times each letter is found in order of the letter appearance, 
in format {letter} -> {times} */

$word = 'apple';
$lettersArr = str_split($word);
$resultArr = [];

foreach ($lettersArr as $key => $letter) {
    if (!array_key_exists($letter, $resultArr)) {
        $resultArr[$letter] = 0;
    }
    $resultArr[$letter]++;
}

foreach ($resultArr as $k => $v) {
    echo $k . ' -> ' . $v . "<br />";
}

/* 6. Count Letters – Sorted
As in Task 5, but the output should be sorted by the times a letter has occurred in descending order, 
then in order of appearance. */

$word = 'apple';
$lettersArr = str_split($word);
$resultArr = [];

foreach ($lettersArr as $key => $letter) {
    if (!array_key_exists($letter, $resultArr)) {
        $resultArr[$letter] = 0;
    }
    $resultArr[$letter]++;
}
arsort($resultArr);

foreach ($resultArr as $k => $v) {
    echo $k . ' -> ' . $v . "<br />";
}

 

Останалите задачи(7, 8, 9 и 10) съм ги събрал в една, защото те реално надграждат.

PHP кода:

<?php

if (isset($_GET['filter'])) {
    $delimiter = $_GET['delimiter'];
    $names = trim(
        preg_replace('/ +/', ' ',
            preg_replace('/[^A-Za-z0-9 ]/', ' ',
                urldecode(
                    html_entity_decode(
                        strip_tags(
                            $_GET['names']
                        )
                    )
                )
            )
        )
    );
    $ages = trim(
        preg_replace('/ +/', ' ',
            preg_replace('/[^A-Za-z0-9 ]/', ' ',
                urldecode(
                    html_entity_decode(
                        strip_tags(
                            $_GET['ages']
                        )
                    )
                )
            )
        )
    );

    // Insert into db
    if (!empty($names) && (!empty($ages))) {
        $connection = mysqli_connect('127.0.0.1','bobby','123456', 'students');

        if (!$connection) {
            die("Connection failed: " . mysqli_connect_error());
        }

        $query = "INSERT INTO students (Name, Age)
                  VALUES (" . "'" . $names . "'" . ",$ages)";

        if (mysqli_query($connection, $query)) {
            echo "<p style='color: green;'>New record created successfully</p>";
        } else {
            echo "Error: " . $query . "<br>" . mysqli_error($connection);
        }
        mysqli_close($connection);
    }
}

// Get data from db
$connection = mysqli_connect('127.0.0.1','bobby','123456', 'students');

if (!$connection) {
    die("Connection failed: " . mysqli_connect_error());
}

if (isset($_GET["itemsPerPage"])) {
    $recordsPerPage  = $_GET["itemsPerPage"];
} else {
    $recordsPerPage = 3;
}

if (isset($_GET["page"])) {
    $page  = $_GET["page"];
} else {
    $page = 1;
}

$startFrom = ($page-1) * $recordsPerPage;


if (isset($_GET['over18'])) {
    $query = "SELECT * FROM students WHERE Age >= 18";
} else {
    $query = "SELECT * FROM students LIMIT $startFrom, $recordsPerPage";
}

$result = mysqli_query ($connection, $query); //run the query

$totalRecords = "SELECT * FROM students";
$totalResult = mysqli_query($connection, $totalRecords); //run the query
$totalRecords = mysqli_num_rows($totalResult);  //count number of records
$totalPages = ceil($totalRecords / $recordsPerPage);

$prevPage =  ($page > 1) ? '<a href="?itemsPerPage=' . $recordsPerPage . '&page=' . ($page - 1) . '" title="Previous page">[Previous]</a>' : '<span style="display: none;">[Previous]</span>';
$nextPage = ($page < $totalPages) ? '<a href="?itemsPerPage=' . $recordsPerPage . '&page=' . ($page + 1) . '" title="Next page">[Next]</a>' : '<span style="display: none;">[Next]</span>';

if (!mysqli_query($connection, $query)) {
    echo "Error: " . $query . "<br>" . mysqli_error($connection);
}
mysqli_close($connection);


include_once 'problem7-frontend.php';

 

Таблицата в базата:

CREATE TABLE `students` (
 `Name` varchar(50) NOT NULL,
 `Age` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

page.js:

var query = window.location.search.substring(1);
var param = query.split("&");

$(function() {
    $('a[href="?' + param[0] + '&' + param[1] + '"]:first').addClass("active");
});

 

problem7-frontend.php:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script src="page.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="style.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<div class="container">
    <div class="col-md-10 col-md-offset-1">
        <form method="get">
            <div>
                Delimiter:
                <select name="delimiter">
                    <option value=",">,</option>
                    <option value="|">|</option>
                    <option value="&">&</option>
                </select>
            </div>
            <div>
                Names:
                <input type="text" name="names"/>
            </div>
            <div>
                Ages:
                <input type="text" name="ages"/>
            </div>
            <div>
                Records Per Page:
                <select name="itemsPerPage">
                    <option value="3">3</option>
                    <option value="6">6</option>
                    <option value="9">9</option>
                </select>
            </div>
            <div>
                Show only over 18 years old:
                <input type="checkbox" name="over18">
            </div>
            <div>
                <input type="submit" name="filter" value="Filter!"/>
            </div>
        </form>
        <table class="table table-striped table-condensed table-bordered table-rounded">
            <thead>
                <tr>
                    <th>Names</th>
                    <th>Ages</th>
                </tr>
            </thead>
            <tbody>
                <?php while ($row = mysqli_fetch_assoc($result)): ?>
                    <tr>
                        <td width="20%"><?= $row['Name']; ?></td>
                        <td width="20%"><?= $row['Age']; ?></td>
                    </tr>
                <?php endwhile; ?>
            </tbody>
        </table>
        <div class="align-center">
            <?= $prevPage; ?>
            <?php for ($i = 1; $i <= $totalPages; $i++): ?>
            <a href='?itemsPerPage=<?= $recordsPerPage; ?>&page=<?= $i; ?>' >[<?= $i; ?>]</a>
            <?php endfor; ?>
            <?= $nextPage; ?>
        </div>
    </div>
</div>

Не са най-добрите решения на света, но работят. Очаквам вашите мнения и препоръки.

 

Поздрави!

0
PHP Web 25/10/2016 15:50:21
netbull avatar netbull -4 Точки

Незнаех, че това всъщност е домашно О_О иначе за задачките ще кажа, че обичаш паста :) 

Задачи 5 и 6 са ти грешни...

може би си имал предвид нещо такова

$word = 'apple';
$lettersArr = str_split($word);
$resultArr = [];

foreach ($lettersArr as $key => $letter) {
    if (!array_key_exists($letter, $resultArr)) {
        $resultArr[$letter] = 0;
    }
    $resultArr[$letter]++;
}
arsort($resultArr);

foreach ($resultArr as $k => $v) {
    echo $k . ' -> ' . $v . "<br />";
}

Но почти си там yes

0
25/10/2016 15:35:36
BobbyKejev avatar BobbyKejev 12 Точки

Благодаря за коментара!
Не знам дали е официално домашно, лектора каза че може да ги решим в къщи или на упражнението.
Да, това имах предивд, но съм разменил местата на променливите в бързината :) Редактирана е, благодаря!

0
netbull avatar netbull -4 Точки

Забелязах още няколко неща за другите задачки.. Незнам от къде да започна :)

  1. Ползваемост на кода
    1. След като събмитнеш формата и си работи всичко, показва резултати и още взето е ОК, но пък се занулява... не помни според събмитнатите резултати съдържанието на полетата и ако трябва да промениш само едно поле трябва да попълниш цялата форма отначало
    2. Този javascript дето го ползваш само, за да сетнеш класа на актив не ти трябва... така или иначе правиш итерация на линковете да ти генерираш можеш дам да го добавиш ако индекса ти е колкото гет променливата за страница или да фолбаква към 1 /тя ти е по подразбиране/
    3. Сетваш $delimiter, а не го ползваш никъде в кода...
  2. Сигурност!
    1. Ескейпваш $_GET['names'] и $_GET['ages'], което е хубаво /може да се подобри, но карай/, а защо не ескейпваш $_GET["itemsPerPage"] и $_GET["page"] ?! surprise
0
BobbyKejev avatar BobbyKejev 12 Точки

1.1 Не съм мислил по тоя въпрос- направих го набързо. Може да добавя някакъв listener.

1.2  Да, този вариант е доста по-добър. Благодаря за идеята.

 

1.3 Ползвах delimiter-a когато записвах всичко във файл, защото разделях стринговете с него. След това промених кода и вече записвам всичко в базата, а там не виждам как да го ползвам.

 

2.1 Не ги ескейпвам, защото ги добавих последни и съм ги пропуснал. За мен е по-важно да ескейпна това, което записвам в базата.

 

Благодаря за градивната критика!

0
netbull avatar netbull -4 Точки

Принципно и дефакто даже ескейпваш всичко що ти влиза в SQL заявката и е подадено от юзъра!

Общо взето приемай това за максима "Never trust the user input" и не забравяй, че ти също си юзър на собственият си код devil

0
BobbyKejev avatar BobbyKejev 12 Точки

Ок, винаги ще го имам предвид ;) Още веднъж благодаря! yes

0