Ответы пользователя по тегу PHP
  • Почему не работает условие if (data.length > 0)?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Немного запутана формулировка вопроса, но для начала попробуйте в php-файле сделать вот что:

    $ret = '';
    foreach ($list as $rs) {
    
        $ret .= '<li>';
        $ret .= '<h2>'.$rs['title'].'</h2>';
        $ret .= '<img src="'.$rs['photo'].'">';
        $ret .= '<p>'.$rs['description'].'</p>';
        $ret .= '</li>';
    }
    echo $ret;
    Ответ написан
  • Как реализовать автоприкрипление файлов на сайт?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Вечер добрый.
    На помощь приходит отличная функция scandir

    $path = '/path/to/dir/';
    $files = array_diff(scandir($path), array('.', '..'));
    var_dump($files);

    $files - массив с именами каждого файла в папке.
    Ответ написан
  • Как исправить такую ошибку в php коде?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Вечер добрый.
    У вас запрос написан в одинарных кавычках. Замените его хотя бы на
    $news = $mysqli -> query("SELECT id, title, description, img_url 
    FROM news 
    ORDER BY id DESC 
    LIMIT $to, $limit");

    Либо на
    $news = $mysqli -> query('SELECT id, title, description, img_url 
    FROM news 
    ORDER BY id DESC 
    LIMIT '. $to. ', '. $limit);
    Ответ написан
    6 комментариев
  • Насколько критично дублирование кода в несколько строк?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Честно? Я бы не стал объединять это в отдельный метод. Экономия на спичках получается.
    Ответ написан
    3 комментария
  • Как спарсить заголовки с inbound.org?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Запрос идёт на https://api.inbound.org/channels/default/new/30?page=1 . В ответе получаете json.
    Но, там есть еще GET-параметр token и я бы, конечно, тоже его генерировал и отправлял. Этот token получается в результате
    encodeURIComponent(t("inbound6session"))
    , с чем вам и надо разобраться.
    Сейчас это все находится в файле https://inbound.org/assets/js/dist/app-21a71a3e87.... и он обфусцирован, но при желании разобраться можно. Ищите по файлу "apiBaseURL" и рядом найдете всё остальное.
    Ответ написан
    Комментировать
  • Почему не работает форма обратной связи?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Так ваш mail.php "умирает" с 500 Internal Server Error. Для этого надо понять что именно вызывает ошибку.
    Вычистите mail.php до простого:
    <?
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    mail('yourmail@gmail.com', 'Code test', 'Message: '. $name .' - '. $phone);


    Отсюда можно будет дальше плясать. Если это не сработает, то просто не работает функция mail() и надо общаться с хостером или писать отправку через внешний SMTP сервер.
    Ответ написан
  • Как пофиксить белый экран на самописной cms?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Есть в PHP крайне полезная функция register_shutdown_function(), которая поможет разобраться с ошибками. Но не забывайте, что сообщения об ошибках должны видеть только вы, а не все подряд при заходе на сайт. Вот пример:

    <?
    register_shutdown_function( "fatal_handler" );
    
    function fatal_handler() {
    	$errfile = "unknown file";
    	$errstr  = "shutdown";
    	$errno   = E_CORE_ERROR;
    	$errline = 0;
    	
    	$error = error_get_last();
    	
    	if( $error !== NULL) {
    		$errno   = $error["type"];
    		$errfile = $error["file"];
    		$errline = $error["line"];
    		$errstr  = $error["message"];
    		
    		echo format_error( $errno, $errstr, $errfile, $errline);
    	}
    }
    
    function format_error( $errno, $errstr, $errfile, $errline ) {
    	$trace = print_r( debug_backtrace( false ), true );
    	
    	$content = '<table style="background-color: #FFFFFF;margin: 0 auto;">
    	<thead><th style="width: 100px;">Item</th><th>Description</th></thead>
    	<tbody>
    	<tr>
    	<th>Error</th>
    	<td><pre>'.$errstr.'</pre></td>
    	</tr>
    	<tr>
    	<th>Errno</th>
    	<td><pre>'.$errno.'</pre></td>
    	</tr>
    	<tr>
    	<th>File</th>
    	<td>'.$errfile.'</td>
    	</tr>
    	<tr>
    	<th>Line</th>
    	<td>'.$errline.'</td>
    	</tr>
    	<tr>
    	<th>Trace</th>
    	<td><pre>'.$trace.'</pre></td>
    	</tr>
    	</tbody>
    	</table>';
    	
    	return $content;
    }


    Это самый простой вариант использования. Добавьте этот код в общий для всей CMS файл и в случае ошибки увидите подробный отчет о проблеме вместо пустого экрана. И не стесняйтесь допилить код под собственные нужды.

    п.с. если хотите это обернуть в класс, то вот каркас

    class PHPFatalError 
    {
    	public function set_handler() {
    		register_shutdown_function(array($this, 'handle_shutdown'));
    	}
    	
    	public function handle_shutdown() {
    		if (($error = error_get_last())) {
    			// echo сообщения о деталях ошибки
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Как подгружать данные при нажатии?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Немного изменю ваш код:

    $(function() {
       $('.col').on('click', function(){
       var SimulatorsIdData = $(this).data('one');
       $.post('/server_side.php', {id: SimulatorsIdData}, function(data){
          // внутри data будет то, что вы отправите в ответ на запрос. То есть результат SQL-запроса в нужном виде
       }, 'json'); // ответ придет в формате json
       });
    });

    Подробнее про $.post.
    Ответ написан
    Комментировать
  • Редактирование мультикатегории?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Добрый день.

    Я этим вопросом тоже когда-то задавался и меня так же смущал вариант удаления всех связок и записи новых, хоть он и является довольно простым и понятным. Меня больше всего смущало "расходование" автоинкрементного поля в этом вопросе, хоть и нет, скорее всего, каких-то технически-верных обоснований для беспокойства об этом.
    Я поступил следующим образом.
    При сохранении брал из таблицы связей имеющиеся данные о категориях (при первом создании их нет, конечно же, при редактировании уже есть).
    Если категория для новости уже была - не делаем ничего.
    Если категория была и ее не стало - удаляем запись из таблицы связок (newscat в вашем случае)
    Если категории не было - добавляем запись в таблицу связок.

    Операции редкие, так что нагрузки лишней эти delete не дают, да и они к тому же единичные получаются. Автоинкремент по чем зря не расходуется (если он есть). Лично я выбрал именно такой вариант.
    Ответ написан
    Комментировать
  • Как проверить наличие в строке слеша?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Добрый день.

    Вам всего лишь надо исправить === TRUE на !== FALSE, то есть
    foreach($get as $getslash){
        if(strpos($getslash, "/") !== FALSE) {
          $getslasharr[] = $getslash;
        }
    }
    print_r($getslasharr);
    Ответ написан
    Комментировать
  • Почему не открывается файл?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Так вы проверьте - file_get_contents($path) открывает файл или нет. Если нет, то проверьте для начала права на файлы. Когда отправляете форму, то проверьте - $_POST вообще содержит данные или нет. Если да, то дальше надо смотреть почему file_put_contents данные не пишет.
    Ну и принимать путь файла из $_GET - совсем плохая идея, но не об этом сейчас речь.
    Ответ написан
    Комментировать
  • На чем лучше и быстрее написать парсер (PHP)?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    За годы парсинга данных я пришел к простому набору:

    Curl + tidy + DOMXpath
    Ответ написан
    Комментировать
  • Как сделать грамотную валидацию на формы?постоянно приходят пустые письма!?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    1. "13+14" - это недокапча, боты легко вписывают 27 в поле answer и ваш скрипт пропустит данные без вопросов. То есть вам придет email, но значений в нем не будет. Используйте нормальную капчу.
    2. Я бы рекомендовал переписать логику обработки данных из формы: required на клиенте для инпутов, конечно, хорошо, но со стороны сервера тоже проверять данные надо, а-ля
    $error = FALSE;
    // ... какая-то логика
    if(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) !== FALSE) {
       $email = $_POST["email"];
    } else 
       $error = 'emailError'; // или текст ошибки или просто TRUE, если нет нужды уточнять
    // ... другая логика
    
    if($error === FALSE)
    {
       mail($sendToEmail, $subject, $content, $senderEmailId);
       header("Location: thankyou.php");
    }
    // ... снова логика


    Это очень упрощенный вариант.
    Ответ написан
  • Как искать unicode chars в xpath?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Если это действительно unicode-символ, а не иконка из какого-нибудь шрифта (FontAwesome, например), то можно попробовать использовать значение символа:

    //*[contains(text(), "&#x2708;")]/ancestor::div[1]
    Ответ написан
    3 комментария
  • Как через xpath добраться до середины текста на php?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Так вы же почти все сами сделали. Чтобы не брать те абзацы, что внутри blockquote, надо ваш же xpath немного преобразовать:
    //p[position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5)][not(parent::blockquote)]
    Ответ написан
    2 комментария
  • PHP+XPath, как выпарсить фрагмент html без необходимости обхода в результирующем объекте всех вложенных узлов для сохранения результата?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Вот пример работающего кода, но советую сделать его отдельным методом или функцией хотя бы, чтобы передавать в нее DOMNode:

    $results = $xpath->query('//div[@class="example"]'); // тут путь до элемента, внутренности которого нужны
    $innerHTML = ''; 
    $children = $results->item(0)->childNodes;
    foreach ($children as $child) 
    	$innerHTML .= $results->item(0)->ownerDocument->saveHTML($child);
    
    echo $innerHTML; // тут все внутренности
    Ответ написан
    Комментировать
  • Как получить элемент по части названия атрибута и по значению?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Попробуйте вот такой вариант

    //*[@*[starts-with(name(), "data-") and normalize-space(.)="123"]]'


    Найдет все элементы у которых есть атрибут, начинающийся на "data-" со значением "123". Значение атрибута мы берем как раз с помощью normalize-space(.).
    Ответ написан
    Комментировать
  • PHP Simple HTML DOM Parser как найти текст?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Именно про PHP Simple HTML DOM Parser говорить не берусь, потому как не использую его, но про чистый xpath сказать могу вот что:

    //*[text()[contains(normalize-space(.),"Employment type")]]


    normalize-space() нужен для того, чтобы избежать проблем с пробелами. Именно это выражение у меня на чистом xpath сработало как надо.
    Ответ написан
    Комментировать
  • Запрос XPath без дочерних элементов?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Если структура html одинакова, то сработает такой вариант
    //div[contains(@class, "some-class")]/div/span[1]/following-sibling::text()

    А вот такой вариант
    //div[contains(@class, "some-class")]/div/text()[normalize-space()]

    выберет все текстовые элементы, исключая пробелы. В конкретно вашем случае в item(0)->nodeValue будет значение между двумя span. Если нужны все текстовые элементу внутри div, то просто пройти foreach по результатам.
    Ответ написан
    2 комментария
  • Как пользоваться выбрать нужные элементы из xml c помощью xpath?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Указанный вами пример рабочий, правда я использовал simple_load_string, но сути это особо не меняет. На выходе будет массив из трех элементов, потому как с атрибутом FirstCode="USD" в вашей xml 3 элемента. Я бы предложил использовать более классический способ работы с xpath:

    $xml = '<CurrencyRateListAnswer>
    <Result>
    <Content>
    <Item FirstCode="USD" SecondCode="RUB">69.966015</Item>
    <Item FirstCode="CNY" SecondCode="KZT">50.799100</Item>
    <Item FirstCode="RUB" SecondCode="KZT">4.859019</Item>
    <Item FirstCode="USD" SecondCode="KZT">323.777331</Item>
    <Item FirstCode="RUB" SecondCode="CNY">0.091096</Item>
    <Item FirstCode="USD" SecondCode="CNY">6.070173</Item>
    </Content>
    </Result>
    </CurrencyRateListAnswer>';
    
    $dom = new DOMDocument('UTF-8');
    $dom->preserveWhiteSpace = false;
    $dom->loadXML($xml);
    
    $xpath = new DOMXPath($dom);
    $query = $xpath->query('//Item[@FirstCode="USD" and @SecondCode="KZT"]');
    echo $query->item(0)->nodeValue; // 323.777331


    Если и этот заведомо рабочий код не работает, то надо проверять подключен ли модуль xpath.
    Ответ написан
    2 комментария