$clientId = '812'; //айди шопа
$apiKey = '04c1d-a754-4c7f-aa2c-8d14e256'; // ключ апи
$method = '/v1/product/list'; //метод запроса
#////тело запроса///#
$data = '{
"stocks": [
{
"product_id": 120000,
"offer_id": "PRD-1",
"stock": 20
},
{
"product_id": 124100,
"offer_id": "PRD-2",
"stock": 20
}
]
}';
#////////#
$result = post($clientId, $apiKey, $method, $data); //вывод результата
echo $result;
//фунция для с работы с API
function post($clientId, $apiKey, $method, $data){
$url = 'http://api-seller.ozon.ru'.$method;
$headers = array(
'Content-Type: application/json',
'Host: api-seller.ozon.ru',
'Client-Id: '.$clientId,
'Api-Key: '.$apiKey
) ;
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => $headers
);
curl_setopt_array($ch, $options);
$html = curl_exec($ch);
curl_close($ch);
return $html;
};
<?php require_once($_SERVER['DOCUMENT_ROOT'] .
"/bitrix/modules/main/include/prolog_admin.php"); ?>
<div class="adm-workarea">
<? $APPLICATION->IncludeComponent(
"bitrix:rest.hook",
".default",
[
"SEF_MODE" => "Y",
"SEF_FOLDER" => "/local/rest/",
"COMPONENT_TEMPLATE" => ".default",
"SEF_URL_TEMPLATES" => [
"list" => "",
"event_list" => "event/",
"event_edit" => "event/#id#/",
"ap_list" => "ap/",
"ap_edit" => "ap/#id#/",
]
],
false
); ?>
<br>
<a href="javascript:void(0)" class="adm-btn adm-btn-green"
onclick="BX.PopupMenu.show('rest_hook_menu', this, [{
'href':'/local/rest/event/0/',
'text':'Исходящий вебхук'
},{
'href':'/local/rest/ap/0/',
'text':'Входящий вебхук'
}])">
Добавить вебхук
</a>
</div>
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_admin.php");
array(
'CONDITION' => '#^/local/rest/#',
'RULE' => '',
'ID' => 'bitrix:rest.hook',
'PATH' => '/local/rest/index.php',
),
https: //site.domain/rest/17607/p8n2dh2hf2nf258n/profile/
что-то по лучше, чем MySQLа что получше - феррари, карьерный самосвал или метро?
Целиком в БД сохраняют с тегами HTML, или Объектом JSON
<?php
$builder = new Builder();
$query = $builder
->table('test')
->select(['*'])
->where(['field1', 'in', [1,2,3]], ['field2', 'like', '%ab%'])
->limit(10, 20)
->get();
$placeholders = $builder->getPlaceholders();
$result = $pdo->prepare($query)->execute($placeholders);
/* фетч результата */
<?php
namespace Compolomus\Builder;
use RuntimeException;
final class Builder
{
private ?string $table = null;
private array $where = [];
private array $columns = ['*'];
private array $placeholders = [];
private ?string $queryType = null;
public function __construct(?string $table = null)
{
if (!is_null($table)) {
$this->table = $table;
}
}
public function table(string $table): Builder
{
$this->table = $table;
return $this;
}
public function count(): Builder
{
$this->queryType = 'select count(*)';
return $this;
}
public function select(?array $columns = null): Builder
{
if (!is_null($columns)) {
$this->columns = $columns;
}
return $this;
}
public function limit(int $limit, int $offset = 0): Builder
{
/*
тут собираем строку с лимит и куда нибудь сохраняем
*/
return $this;
}
public function where(array $conditions, string $type = 'and'): Builder
{
foreach ($conditions as [$field, $condition, $value]) {
/* тут собираем строку из поля, значения и типа */
/* вместо значения подставляем плейсхолдер ? для подготовленных выражений */
$this->placeholders[] = $value;
}
/* куда то сохраняем собранную строку,
по типу собираем массив с типом обьединения,
тут на самом деле всё сложно,
возможно проще будет создать Where класс и отдать туда обработку
*/
return $this;
}
/**
* @throws RuntimeException
*/
public function get(): string
{
if (is_null($this->queryType)) {
throw new RuntimeException('Undefined query type');
}
$query = strtoupper($this->queryType);
/* тут собираем весь запрос из кусочков */
return $query;
}
public function getPlaceholders(): array
{
$placeholders = $this->placeholders;
$this->placeholders = [];
/* обязательно обнуляем, возможно и весь билдер для следующего запроса */
return $placeholders;
}
}
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->registerEventHandler('sender', 'OnAfterRecipientUnsub', 'lead.newsletter', '\\Lead\\Newsletter\\Event\\MailEvent', 'C_OnAfterRecipientUnsub');
RemoveHandler .php .phtml .php3 .php4 .php5 .php6 .phps .cgi .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .py
AddType application/x-httpd-php-source .php .phtml .php3 .php4 .php5 .php6 .phps .cgi .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .py
php_flag engine 0
<Files *.php>
Deny from all
</Files>
display: none;
, visibility:hidden;
, opacity:0;
, так как многие боты и это раскусят.<form action="">
<input type="text" name="copyemail" placeholder="Email для копии">
<input type="text" name="name" placeholder="Имя">
<input type="email" name="email">
<button type="submit">Отправить</button>
</form>
input[name="copyemail"] {
display: block;
width: 2px;
height: 2px;
margin-bottom: -2px;
border: none;
padding: 0;
opacity: 0.01;
}
if ($_POST['copyemail']) {
//Это спам! Делаем вид, что сообщение отправлено.
die('Ваше сообщение отправлено');
} else {
//Все норм. Метро Люблино, работаем
}
Parser
и метод parse()
должен парсить.import()
, то скорее всего он должен быть переименован, все-таки вы сохраняете данные в БД, а не импортируете данные извне в ваш код. И должен лежать в другом сервисном классе. Например, {Article}DAO
<?php
return [
'db' => [
'host' => '127.0.0.1',
'port' => 3306,
'db' => 'pizza',
'user' => 'root',
'pass' => '',
'charset' => 'utf8mb4',
]
];
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli(
$config['db']['host'],
$config['db']['user'],
$config['db']['pass'],
$config['db']['db'],
$config['db']['port']
);
$db->set_charset($config['db']['charset']);
$db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
.
<select id="single" class="form-control" name = '1234' >
<option value="" disabled selected style='display:none;'>выберите тип</option>
<?php foreach($types as $object): ?>
<option value ="<?=$object['id']?>"><?=$object['name']?></option>
<?php endforeach ?>
</select>
<?php
$config = require 'config.php';
require 'mysqli.php';
$sql="SELECT * FROM pizza";
$types=$db->query($sql)->fetch_all(MYSQLI_ASSOC);
include 'pizza.tpl.php';
бизнес-логика
include header
?>
хтмл конкретной страницы
<?php include footer ?>
function render_template($filename, array $data = [])
{
ob_start();
extract($data);
require __DIR__ . '/' . $filename;
return ob_get_clean();
}
бизнес-логика
...
$page_html = render_template('page.tpl.php', [
'data' => $data,
]);
echo render_template('main.tpl.php', [
'navigaton' => $nav_list,
'title' => $title,
'page' => $page_html,
];
...
<?php foreach ($navigation as $item): ?>
<li>
<a href="<?= e($item['href']); ?>"><?= e($item['title']); ?></a>
</li>
<?php endforeach ?>
Важно! Любой вывод в этих шаблонах должен экранироваться в обязательном порядке (кроме очевидных случаев, когда мы выводим результат рендера).Мне не понятно, где тогда хранится весь ответ клиента, если не в памяти ?В памяти конечно, но так как это оболочка над данными, то реализация скрыта, условно вы можете считать это файлом, который может активно меняться.
Например, когда мы вызываем функцию fopen, то в результате мы получаем ресурс, который в себе содержит дескриптор файла, и далее мы уже можем работать с этим файлом не считывая его полностью в память.
Как я понимаю, через потоки.. но что это за потоки ? где именно про них почитать ? это какие-то механизмы операционной системы ?
Особенно такой вот индусской функцией, которая сама по себе - пример редкого идиотизма: сначала заменяем символы < и > на HTML сущности... а потом бодро пытаемся вырезать HTML теги. Которых к этому моменту в тексте не останется ни одного!
Или функция stripcslashes, которая здесь вообще ни к селу, ни к городу. Если я хочу написать сочетание \n, то с какой стати эта функция будет заменять его на перевод строки?
Всё что можно оставить из этого безумного набора - это trim(). Да и то не всегда. Как правильно заметил Rsa97, могут быть случаи, когда лидирующие пробелы имеют значение, например, при выводе форматированного кода. Кстати, этим как раз грешит Хабр. Если запостить код с отступами, то первый будет "съеден"!
json_encode()
escapeshellarg()
. Если в регулярку - то preg_quote()
. Имя файла для инклюда из переменной (хотя так делать вообще не стоит) надо хотя бы обрабатывать через basename()
. И так далее.