- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
<?php
echo count($arr);
$i = count($arr) - 1;
for ($i; $i >= 0; $i--) {
?>
<div class="post" id="p<?php echo $arr[$i]->_id; ?>">
<div class="p_title"><?php echo $arr[$i]->title; ?></div>
<div class="p_content"><?php echo $arr[$i]->content; ?></div>
<div class="p_date"><?php echo $arr[$i]->date; ?></div>
<form id="<?php echo $arr[$i]->_id; ?>" action="index.php" method="get">
<!--<textarea rows="4" cols="50" name="removid" style="display: none;" ><?php echo $arr[$i]->_id; ?></textarea>-->
<input type="text" name="removid" form="<?php echo $arr[$i]->_id; ?>" value="<?php echo $arr[$i]->_id; ?>"/>
<input type="submit" class="p_remove" onclick="dele('<?php echo $arr[$i]->_id; ?>');" form="<?php echo $arr[$i]->_id; ?>" value="Удалить"/>
</form><!--</div>-->
<?php echo $arr[$i]->_id; ?>
</div>
<?php
}
?>
<script>
function dele(param){
var jsVar = "<?php
$removid = $_GET['removid'];
$bulk = new MongoDB\Driver\BulkWrite;
//$bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
$query = new MongoDB\Driver\Query(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
$bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
try {
$result = $manager->executeBulkWrite('forum.posts', $bulk, $writeConcern);
//header('Location: https://benar.wtf/index.php');
}
catch (MongoDB\Driver\Exception\BulkWriteException $e) {
$result = $e->getWriteResult();
}
?>";
}
</script>
guest # 0
Но с точки зрения ПХП разрабочтика это самый обычный код.
Ментальная разница
nblXOMAKAKA # 0 ⇈
MAKAKA # 0 ⇈
guest # 0 ⇈
nblXOMAKAKA # 0
Начнём с того, что т со второй строки. Куда выведется это echo count($arr);? В каком блоке оно окажется?
Далее: закомментированный HTML-код (<!--) в шаблоне лучше не оставлять. Это приводит к трудноуловимым ошибкам в вёрстке. Сам на такое
onclick="dele... тоже не рекомендуют. Лучше в HTML оставить разметку, а обработчики событий навесить отдельным скриптом после загрузки страницы (google: «ненавязчивый js», «unobtrusive js»). Хотя в принципе пойдёт.
Всё выше — это мои придирки. А теперь о серьёзном. Кошмар начинается на 24-й строке. Код для обращения к СУБД прямо в шаблоне да ещё и в том месте, где должна быть константа для js. Не надо так. Что в итоге сохранится в jsVar?
Ну и наконец, значение $removid, полученное как $_GET['removid'], никак не проверяется, да?
В общем, классика: «just stringing random characters together until it compiles».
Годно.
MAKAKA # 0 ⇈
Notice
guest # 0 ⇈
MAKAKA # 0 ⇈
Это хороший аргумент.
Вот тебе еще немного
1.Код может и не идеальный, зато понятный в отличие от других языков
2. Ой, можно подумать на ваших С++ было бы лучше
phpBidlokoder2 # 0 ⇈
guest # 0 ⇈
И на любом другом языке -- тоже
Вообще сложно представить кейс, когда переписывание кода с ПХП на любой другой язык не сделает код в тысячу раз лучше
jojaxon # 0 ⇈
nblXOMAKAKA # 0 ⇈
jojaxon # 0 ⇈
Либо по-старинке генеришь html на PHP с обычными формами, либо html, js-скрипты и RestAPI отдельно.
nblXOMAKAKA # 0 ⇈
nblXOMAKAKA # 0 ⇈
Судя по названию функции, автор ожидает, что этот пыхокод будет выполняться по вызову js-функции dele, т. е. по клику пользователя.
На самом же деле этот код будет выполняться при каждой загрузке страницы, ещё до того, как пользователь куда-нибудь кликнет.
Однако, это может работать, если атрибут action у формы указывает на эту же страницу. Просто когда никаких GET-параметров не передавали, на 24-й строке (где $removid = $_GET['removid'];) вылезет нотис, а в «MongoDB» передастся null, поэтому ничего не удалится. А когда пользователь нажмёт кнопку отправки формы, произойдёт отправка GET-запроса (поскольку функция dele НЕ возвращает false), и код, размещённый с 23-й строки получит нужный GET-параметр.
Итак, обезьяна, написавшая этот код, не думает о том, что исполняется у клиента, а что на сервере, и течёт, а код оказался рабочим (хотя и с пачкой нотисов) по счастливой случайности. Именно поэтому я за «PHP».
Чуть не забыл: использовать метод GET для удаления данных не рекомендуется. Метод POST тут был бы более уместен.
nblXOMAKAKA # 0 ⇈
Удаляем атрибут onclick и теги <script>, </script> (оставив то, что было в кавычках), в итоге код работает точно так же.
1024-- # 0 ⇈
Кстати, полезно было бы иметь какую-то РПЦ для того, чтобы такое работало. Только синтаксис поудобнее - чтобы меньше вопросушни.
Либо вложенные блоки <client> и <server>, либо вообще полная неявнушня:
Приложение понимает, какой список функций есть у клиента или сервера, и вызывает их при наличии. Рефлексия и эквивалентность [] и . убраны по максимуму. Компилятор старается объединить или переставить блоки так, чтобы управиться минимумов запросов. Никаких явных запросов нет, только вызовы функций. Асинхрушня спрятана под капотом. Есть стратегии компиляции - "больше на сервере", "больше на клиенте", "минимум передачи данных" и хинты "server function() {}", "client function() {}".
MAMOHT # 0 ⇈
Кстати, в ASP.NET есть атрибуты runat="server" и runat="client". Как они работают? Какой в итоге HTML- и JS-код получает клиент и что отправляется от клиента серверу?
guest # 0 ⇈
<script runat="server">
</script>
это тоже, что
<?
?>
в пых
а
<script runat="client">
</script>
превращается в
<script>
</script>
MAMOHT # 0 ⇈
MAKAKA # 0 ⇈
По сути нажатие её это сабмит формы и вызов обраточика на сервере
MAMOHT # 0 ⇈
guest # 0 ⇈
У нас есть файлы
* SomePage.aspx: сама форма (щаблон)
* SomePage.aspx.cs: т.н. Code Behind: сюда идет код для ее обработки
* SomePage.aspx.designer.cs: Это автогенеренный код (он будет генерится, когда я буду править шаблон), он мерджится с кодом в Code Behind.
Используются partial классы C#: часть класса описана в одном файле, часть в другом. До 2008 так было нельзя, и генерился код прямо в Code Behind.
SomePage.aspx:
"WebApplication1.SomePage" это класс в SomePage.aspx.cs, который наследует эта страница.
"ButtonClicked" -- метод того класса.
"Display" его Property, правда его автоматом сгенерила студия в SomePage.aspx.designer.cs когда я прописал ID.
продолжение следует
guest # 0 ⇈
SomePage.aspx.cs
Тут виден наш метод, который вызовется, а образение к проперти Display.
SomePage.aspx.designer.cs
Вот наше проперти.
продолжение следует
guest # 0 ⇈
В HTML форма выглядит так
В INPUT зашит стейт объектов.
guest # 0 ⇈
В asp был только <script runat=server
В asp.net есть формы и code behinв
nblXOMAKAKA # 0 ⇈
Спасибо. Теперь ясно, откуда берутся «ctl» с цифрами на сайтах.
Я подозревал, что через input type="hidden" должно что-то добавляться, чтобы опознать нажатую кнопку. Значит, ещё добавляется скрипт на стороне клиента, чтобы корректировать это скрытое значение, если кнопок в форме много.
MAKAKA # 0 ⇈
Общий смысл в том, что ты пишешь так, словно бы у тебя обычная винформа, а не веб.
Нажал кнопк -- вызвался код на C#. Можно переиспользовать веб-форм макак в задачах для веба
nblXOMAKAKA # 0 ⇈
Кстати, есть ли аналоги runat в каких-нибудь фреймворках на других языках?
guest # 0 ⇈
Был WinForms, стал WebForms.
Кстати, веб-формы (эта питушня так и называется WebForms) -- не единственный "фреймворк" под ASP.NET.
Можно писать и без них. Можно писать более низкоуровнево, обрабатывая HTTP запросы, и был еще MVC.NET.
Формы, внезпано, действительно удобны иногда: вот у тебя есть база данных, и тебе нужно дать питузу возможность получить из нее таблицу
Как ты понимаешь, есть готовый компонент под фомры, который эту таблицу выводит, и он ничем не отличается (с точки зрения питуха) от такого же компонента для винфомы:)
https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.datagrid?view=netframework-4.8
nblXOMAKAKA # 0 ⇈
1024-- # 0 ⇈
Такой подход позволит меньше пердолиться по поводу взаимодействия, быстро писать небольшие сайты и прототипы. Если развить инструменты (хинты и другие средства языка, подсказки компилятора), то можно будет писать на таком и приложения побольше.
Например,
можно решить за один запрос. Поскольку x, y, z ортогональны, можно переставить их получение и собрать получение x, z в один запрос к серверу.
bormand # 0 ⇈
1024-- # 0 ⇈
guest # 0 ⇈
1024-- # 0 ⇈
Но, думаю, с современными достижениями компитуляции эту питушню можно сгустить до одного запроса, если во время итереции побочные эффекты имеются только на одной стороне. Либо выставить жирное предупреждение на каком-то этапе.
KOPOHABuPYC # 0 ⇈