• Откуда пустые строчки или переносы в цикле?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Проще всего посмотреть
    $rs = $stmt->fetch(PDO::FETCH_ASSOC)
    var_dump($rs);

    Оттуда станет понятно где проблема.
    Ответ написан
    4 комментария
  • Curl и вечная обновление страницы?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Дело в том, что в $content есть какой-то js-код, который в браузере после echo исполняется и отсюда редиректы.
    Ответ написан
    Комментировать
  • Почему не работает условие 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 комментария
  • Как правильно парсить страницу, на которой надо выбрать производителя?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Есть хорошая новость и плохая.

    Хорошая:
    Перед обращением по URL вы можете вручную выставить cookie isBestLocationDetected = true и у вас не будет экрана запроса производителя.

    Плохая:
    Если будете активно обращаться к серверу, то получаете капчу.

    Если же финт с cookie не устраивает, то при парсинге просто определяете что именно сейчас получил парсер - страницу с данными о товаре или выбор производителя. Если производителя, то phantomJS умеет в click(), так что проблем быть не должно. Но, я думаю, cookie должно хватить.
    Ответ написан
    24 комментария
  • Как спарсить заголовки с 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" и рядом найдете всё остальное.
    Ответ написан
    Комментировать
  • Как мне правильней составить файл .htaccess?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Местами поменять правила
    Ответ написан
    2 комментария
  • Как конвертировать с windows-1251 в utf-8?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Вот тут подсказывают такое решение:

    body = new Buffer(body, 'binary');
    conv = new iconv.Iconv('windows-1251', 'utf8');
    body = conv.convert(body).toString();
    Ответ написан
    3 комментария
  • Как добавить html элемент к динамически добавленному элементу?

    glebovgin
    @glebovgin
    Full Stack Web Developer
    Чудес не бывает. Не отрабатывает селектор значит, то есть, грубо говоря, js-код отрабатывает до того, как элемент появился в DOM-дереве. Чтобы проверить эту теорию, можно использовать таймаут (setTimeout()). Но это не единственная возможная проблема.
    Ответ написан
    Комментировать
  • Почему не работает форма обратной связи?

    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 комментария