Задачите от първата 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>
Не са най-добрите решения на света, но работят. Очаквам вашите мнения и препоръки.
Поздрави!
Благодаря за коментара!
Не знам дали е официално домашно, лектора каза че може да ги решим в къщи или на упражнението.
Да, това имах предивд, но съм разменил местата на променливите в бързината :) Редактирана е, благодаря!
Забелязах още няколко неща за другите задачки.. Незнам от къде да започна :)
1.1 Не съм мислил по тоя въпрос- направих го набързо. Може да добавя някакъв listener.
1.2 Да, този вариант е доста по-добър. Благодаря за идеята.
1.3 Ползвах delimiter-a когато записвах всичко във файл, защото разделях стринговете с него. След това промених кода и вече записвам всичко в базата, а там не виждам как да го ползвам.
2.1 Не ги ескейпвам, защото ги добавих последни и съм ги пропуснал. За мен е по-важно да ескейпна това, което записвам в базата.
Благодаря за градивната критика!
Принципно и дефакто даже ескейпваш всичко що ти влиза в SQL заявката и е подадено от юзъра!
Общо взето приемай това за максима "Never trust the user input" и не забравяй, че ти също си юзър на собственият си код
Ок, винаги ще го имам предвид ;) Още веднъж благодаря!