PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (7): [1] 2 3 4 5 6 7 »

> Найдено сообщений: 94
Wooorker Отправлено: 03 Декабря, 2020 - 15:53:53 • Тема: Старости книги "PHP и MySQL. Разработка Web-приложений. 6-е изд. " Колесниченко Д. • Форум: Литература

Ответов: 1
Просмотров: 1469
23. 2 Установка Smarty
В книге написано про актуальную версию 2.6.26.
На 02.12.2020 актуальной является версия 3.1.35.
Сочетание этой версии Smarty и PHP7 заставляет внести изменения в код дальнейших глав:

23.3
Здесь автор приводит пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. define('SMARTY_DIR', 'libs/');
  3. require([b]SMARTYDIR[/b] . 'Smarty.class.php');
  4. class MySmarty extends Smarty {
  5.    function MySmarty ()
  6.    {
  7.         [b]$this->Smarty();[/b]
  8.         $this->template_dir = 'templates/';
  9.         $this->compile_dir  = 'templates_c/';
  10.         $this->config_dir   = 'config/';
  11.         $this->cache_dir    = 'cache/';
  12.         $this->caching = true;
  13.    }
  14. }

Однако данный пример не работает, ругается на ошибку в libs/sysplugins/smarty_internal_ data.php on line 290.
Чтобы обойти эту ошибку нужно исправить код на:
PHP:
скопировать код в буфер обмена
  1.  
  2. define('SMARTY_DIR', 'libs/');
  3. require([b]SMARTY_DIR[/b] . 'Smarty.class.php');
  4. class MySmarty extends Smarty{
  5.         function MySmarty ()
  6.         {
  7.                 [b]parent::__construct();
  8.                 // $this->Smarty();[/b]
  9.                 $this->template_dir = 'templates/';
  10.                 $this->compile_dir = 'templates_c/';
  11.                 $this->config_dir = 'configs/';
  12.                 $this->cache_dir = 'cache/';
  13.                 $this->caching = true;
  14.         }
  15. }
Wooorker Отправлено: 20 Марта, 2015 - 21:01:24 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
Мелкий пишет:
Зачем делается ON DUPLICATE KEY UPDATE и почему его лучше не использовать я, конечно, знаю. Вот это нафига сделано:
Wooorker пишет:
id=LAST_INSERT_ID(id)


Когда на выходе нужно знать id обновлённой записи, то без id=LAST_INSERT_ID(id) этого никак не сделаешь.
Мелкий пишет:

Раз execute дал false, то надо смотреть текст ошибки. И не понятно, нафига вы штатные исключения PDO отключили.

Штатные исключения не отключал. Видимо в настройках сервера/php были по-умолчанию отключены. В этих настройках я не силён. Сервер debian , php 5.2
Wooorker Отправлено: 20 Марта, 2015 - 20:01:05 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
Мелкий пишет:
Wooorker пишет:
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name

Смотрю вот на это и не понимаю - нафига это сделано?

Не могу поверить. Судя по вашему рейтингу вы не можете не знать зачем используется "ON DUPLICATE KEY UPDATE"
Мелкий пишет:

В коде:
Wooorker пишет:
INSERT INTO `".$this->_goods."` (kod, artikul, name, price, razdel, kod_site, image_url, new, upak, size)                VALUES (:kod, :name)


Ошибся, немного не то скопировал. В своём предыдущем посте исправил.
Wooorker Отправлено: 20 Марта, 2015 - 12:16:55 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
Я докучи ещё спрошу по этому же вопрос, только другая проблема.
После вышеприведённого кода для проверки ввёл код
PHP:
скопировать код в буфер обмена
  1. if ($id == 0) echo 'У id = 0 !!!<br>';

И вот прогнал все записи и только у одной вышла такая ошибка:
CODE (html):
скопировать код в буфер обмена
  1. Не удалось добавить/обновить запись с помощью запроса:
  2. INSERT INTO `goods` (kod, name) VALUES (:kod, :name) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name
  3. У id = 0 !!!


id я определяю следующим образом (ещё раз весь код)

PHP:
скопировать код в буфер обмена
  1.                 $sql="INSERT INTO `".$this->_goods."` (kod, name)
  2.                VALUES (:kod, :name)
  3.                ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  4.                 $stmt=$this->db->prepare($sql);
  5.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name ))) echo 'Не удалось добавить/обновить запись с помощью запроса: <br>'.$sql.'<br>';
  6.                 $id = $this->db->lastInsertId();
  7.                 $stmt->closeCursor();
  8.                 if ($id == 0) echo 'У  id = 0 !!!<br>';

Есть какие-нибудь идеи?

P.S. Хотя вряд ли тут что сделаешь не зная значений kod & name. Буду тестить конкретно по этой записи.
Wooorker Отправлено: 20 Марта, 2015 - 09:11:03 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
exlant пишет:

разница существенная! вставляемые таким образом данные, экранируются самими pdo

Цитата:
Вызов PDO::prepare() и PDOStatement::execute() для запросов, которые будут запускаться многократно с различными параметрами, повышает производительность приложения, так как позволяет драйверу кэшировать на клиенте и/или сервере план выполнения запроса и метаданные, а также помогает избежать SQL иньекций, так как нет необходимости экранировать передаваемые параметры.

я рекомендую все же перечитать, что здесь написано http://php.net/manual/ru/pdo.prepare.php

а вот здесь ошибся не много, первые переменные не заметил!
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  3.               VALUES (:kod, :name) // поправил
  4.               ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  5.                 $stmt=$this->db->prepare($sql);
  6.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name))) echo "";
  7.  


Про ошибку-то я заметил, это не вопрос.
Да, действительно, данный способ помог решить проблему.
Обычно я bindю данные для excute, но в данном случае вставляется/обновляется единичная запись, поэтом решил пойти прямым путём. Не думал, что здесь и проблема с экранированием решается.
Wooorker Отправлено: 20 Марта, 2015 - 08:24:37 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
exlant пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  3.               VALUES ('$kod', '$name')
  4.               ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  5.                 $stmt=$this->db->prepare($sql);
  6.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name))) echo "";
  7.  

почему не так тогда?

http://php.net/manual/ru/pdo.prepare.php


А разница? Работает одинаково.
По существу вопроса: на предложенный вами вариант сервер сильно ругается
CODE (html):
скопировать код в буфер обмена
  1. mysql_real_escape_string(): Access denied for user 'username' (using password: NO) in /var/www/script.inc.php on line N
  2. Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/script.inc.php on line N
Wooorker Отправлено: 20 Марта, 2015 - 08:09:40 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
exlant пишет:
mysql_real_escape_string

а по сути уже пора переходить на mysqli или pdo, с их подготавливаемыми запросами


так я pdo только и пользуюсь
PHP:
скопировать код в буфер обмена
  1. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  2.                VALUES ('$kod', '$name')
  3.                ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = '$kod', name = '$name'";
  4.                 $stmt=$this->db->prepare($sql);
  5.                 if(!$stmt->execute()) echo "";
Wooorker Отправлено: 20 Марта, 2015 - 07:45:39 • Тема: addslashes • Форум: Вопросы новичков

Ответов: 13
Просмотров: 621
Нужно писать в базу некий текст. В котором иногда встречается апостроф '
mysql, естественно, отказывается писать его в базу, при этом двойные кавычки и проч пишутся без проблем.
Если я пользуюсь addslashes(), то всё пишется в базу, зато материал, который берётся из этой базы для отображения на сайте отображается не в виде ", а в виде /", т. е. с ненужными мне слэшами.
Подскажите, как можно решить эту проблему на стадии записи в БД, т. к. вывод на экран из БД я изменить не могу.
Wooorker Отправлено: 07 Февраля, 2015 - 19:43:38 • Тема: на что заменить return чтобы значения пол.функции (весь массив) вернулось но не прерывалось • Форум: Вопросы новичков

Ответов: 6
Просмотров: 573
bustez пишет:
как можно вернуть значения чтобы они все вернулись?

PHP:
скопировать код в буфер обмена
  1.  
  2.                 $massGet = file_get_contents('inc/test.txt');//строка
  3.                 $mass = explode("|||", $massGet);//разбит на массивы
  4.                 return $mass;
  5. }
  6.  
Wooorker Отправлено: 22 Января, 2015 - 14:27:01 • Тема: Презентация 16 слайдов в одном файле pdf на чистом php • Форум: Вопросы новичков

Ответов: 3
Просмотров: 257
Имеется презентация (16 страниц) в формате pdf.
Стоит задача вывести эту презентацию на сайте и реализовать возможность оставлять комментарии и сохранять к конкретному слайду.
Гугл на фразу "скрипт php вывода pdf" ничего полезного не даёт.
Отсюда вопрос: м. б. выводить презентацию надо не в формате pdf, а конвертировать в какой-то другой формат? Или есть возможность с pdf проделать такой фокус?
Wooorker Отправлено: 21 Января, 2015 - 07:30:35 • Тема: Преобразовать if(strpos()===false){}else{} • Форум: Вопросы новичков

Ответов: 4
Просмотров: 225
Работает вот такая конструкция
PHP:
скопировать код в буфер обмена
  1.                 if(strpos($value['name'], 'Размер')===false){
  2.                         //echo "НЕ Найден размер!<br>";
  3.                 }else{
  4.                     $tsize=$value['value'];
  5.  

Как построить аналогичное условие, но без else?
не предлагать, т. к. не работает.
Wooorker Отправлено: 09 Января, 2015 - 20:24:05 • Тема: Выбор значений из двумерного массива sql • Форум: Вопросы новичков

Ответов: 3
Просмотров: 461
Ещё раз обращаю ваше внимание, что все вычисления можно сделать прямо в запросе к таблице. С учётом последних добавлений запрос будет сложнее (нужно будет сделать что-то вроде этого
SELECT t1.id, MAX(t1.procent) FROM `tbl_proq`
LEFT JOIN (SELECT id, (totalsize/maxsize) as procent FROM `tbl_proq`) t1 ON t1.id=tbl_proq.id
WHERE ...)
и дальше проверяем на количество записей.
Запрос на работоспособность не проверял, но как-то так.
Wooorker Отправлено: 08 Января, 2015 - 18:53:28 • Тема: lastinsertid возращает 0 • Форум: Вопросы новичков

Ответов: 12
Просмотров: 589
KEFIR4UK пишет:
Но всеравно возвращает 0, если я туплю где то , то скажите))

Посмотри как у "Джейсон Ленгсторф - PHP и jQuery для профессионалов - 2011" реализован класс подключения.
PHP:
скопировать код в буфер обмена
  1.         protected function __construct($db=NULL){
  2.                 if (is_object($db))
  3.                 {
  4.                         $this->db=$db;
  5.                 }
  6.                 else
  7.                 {
  8.                         $dsn="mysql:host=".$db_host.";dbname=".$db_name;
  9.                         try
  10.                         {
  11.                                 $this->db = new PDO($dsn, $db_username, $db_password);

т. е. в конструкторе соединения с БД проверяем создан ли объект ранее. Если создан, то возвращаем его, если нет, то создаём новый.
Wooorker Отправлено: 06 Января, 2015 - 20:54:50 • Тема: Выбор значений из двумерного массива sql • Форум: Вопросы новичков

Ответов: 3
Просмотров: 461
Какой смысл делать танцы с бубном в массиве, когда всё это можно в запросе сделать?
Добавляете в where (totalsize + 999) <= maxsize limit 1
Если запрос вернёт вам запись - вот получите то, что надо, если записей не будет, значит "нету места".
Wooorker Отправлено: 04 Января, 2015 - 18:33:56 • Тема: Сложение значений ассоциативного массива • Форум: Напишите за меня, пожалуйста

Ответов: 1
Просмотров: 49
XuPoH пишет:
Всем ку, нужна помощь
Есть массив вида
["2014-01-02" => "30",
"2014-01-02"=>"10",
"2014-01-03"=>"2"
]

Сдаётся мне, что это не массив, т. к. не может быть в массиве 2 ключей с одним именем.
Если это таблица в mysql, то там просто сделать запрос с SUM(заработок) GROUP BY (дата).
Но, если всё же с массивами баловаться, то будет так:
PHP:
скопировать код в буфер обмена
  1.             $arr1=array(array("2014-01-02"=>"30"),array("2014-01-02"=>"10"),array("2014-01-03"=>"2"));
  2.             $arr2=array();
  3.             foreach($arr1 as $arr_key=>$arr_value){
  4.                 foreach($arr_value as $key1=>$value1) {
  5.                     $value = $value1;
  6.                     foreach($arr2 as $key2=>$value2){
  7.                         if ($key2==$key1) {
  8.                             $value = $value + $value2;
  9.                         }
  10.                     }
  11.                     $arr2[$key1]=$value;
  12.                 }
  13.             }
  14.             print_r($arr1);
  15.             echo '<br>';
  16.             print_r($arr2);


Результат
CODE (html):
скопировать код в буфер обмена
  1. Array ( [0] => Array ( [2014-01-02] => 30 ) [1] => Array ( [2014-01-02] => 10 ) [2] => Array ( [2014-01-03] => 2 ) )
  2. Array ( [2014-01-02] => 40 [2014-01-03] => 2 )

Страниц (7): [1] 2 3 4 5 6 7 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB