PHP.SU

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

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

> Найдено сообщений: 49
ЧИМ Отправлено: 19 Февраля, 2017 - 15:07:29 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
Строитель пишет:
ЧИМ пишет:
выдаёт ошибку: "Parse error: syntax error, unexpected '[' "
Проверьте версию пхп. Она должна быть не ниже 5.4. Если версия ниже, и нет возможности её поднять, тогда замените строку с сокращённым синтаксисом объявления массива на этот вариант:

static $conns = array();

Пока правил текст вы уже написали ответ. Спасибо за оперативность. Поменял версию на 7.1 Буду на ней всё тестить. Ошибка в синтаксисе пропала, но появились другие. Выше представил код который нормально работает на версии 7.1(имею ввиду не вызывает ошибок)

P.S. Сейчас продолжаю тестить этот способ и столкнулся с тем что я не могу обратиться из файла к подключению mysql. Получается что не возвращает подключение.
ЧИМ Отправлено: 19 Февраля, 2017 - 14:47:49 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
Там ошибка в примере(по крайней мере у меня этот пример в таком виде не работает).
Сейчас вот в таком виде работает
connect_1.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $con_arr = array (
  4.  'HOST'=>'localhost',
  5.  'DB'=>'base',
  6.  'LOGIN'=>'user',
  7.  'PASSW'=>'12345',
  8.  'charset'=>'utf8', );
  9.  

SqlDB.php
PHP:
скопировать код в буфер обмена
  1.  
  2. class SqlDB {
  3. function conn($DB)
  4. {
  5.     static $conns = [];
  6.  
  7.     if(!isset($conns[$DB])) {
  8.         require_once("apteka/config/connect_1.php");
  9.         extract($con_array);
  10.         $conns[$DB] = new mysqli($HOST,$LOGIN,$PASSW,$DB);
  11.         $conns[$DB]->set_charset($charset);
  12.     }
  13.  
  14.     return $conns[$DB];
  15. }
  16.  
  17. function myDatabase() {
  18.     return conn('my_database');
  19. }
  20. }
  21.  
ЧИМ Отправлено: 18 Февраля, 2017 - 22:53:51 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
Строитель пишет:
Нет, возвращается объект mysqli (если в процедурном - то это был бы тип "ресурс"), с которым вы будет производить дальнейшие операции (выборка из базы, и т.п.).

PHP:
скопировать код в буфер обмена
  1. function myDatabase() {
  2.     return conn('my_database');//[b]Просто возвращаем имя базы?[/b]
  3. }

На сколько я понял тут задаётся имя базы, но я его так же получаю из файла, так как "мастер создания подключения" его записывает в файл с настройками подключения и я его оттуда беру.

И вот эта строчка меня смущает "$conns[$dbName] = new mysqli($host, $user_name, $password, $dbName); " Почему например здесь не "$conns[$host]... " или вообще не отдельная переменная ? Ведь по идее мы можем после получения переменных из фала сразу сделать подключение с обычной переменной "$con = new mysqli($host, $user_name, $password, $dbName); " Просто так же объявим её статичной в начале "static $con;" и всё, зачем мы используем именно "$conns[$dbName]"? Или это делается просто для простоты проверки? Т.е. Если есть какое либо присвоенное значение в массиве $conns[] с элементом массива $dbName то просто вернуть это значение? Получается что в моём случае эта функция не совсем корректна. Дело в том что у меня сначала происходит просто подключение к серверу, а после этого создаётся база и используется в подключении во всех остальных манипуляциях. Но идея с "extract" отличная.
Скажите а если я сделаю следующим образом:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. function conSQL()
  4. {
  5. static $con;
  6.  
  7.  extract(require_once("config/connect.php"));
  8. if(isset($dbName))
  9. {
  10. $con = new mysqli($host, $user_name, $password, $dbName);
  11. }
  12. else
  13. {
  14. $con = new mysqli($host, $user_name, $password);
  15. }
  16. return $con;
  17. }
  18.  

т.е. по идее я смотрю в файл, если там присутствует переменная, то я пытаюсь подключиться с её значением, если же нет то я просто выполняю подключения к серверу MYSQL для последующего создания базы. Правильно?
ЧИМ Отправлено: 18 Февраля, 2017 - 21:30:22 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
armancho7777777 пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. // File: /path/to/config/db/my_database.php
  3.  
  4. return [
  5.     'host'      => 'localhost',
  6.     'user_name' => 'dendy',
  7.     'password'  => '12345',
  8.     'charset'   => 'utf8'
  9. ];


PHP:
скопировать код в буфер обмена
  1. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  2.  
  3. /**
  4.  * @param string $dbName
  5.  * @return mysqli
  6.  * @throws mysqli_sql_exception
  7.  */
  8. function conn($dbName)
  9. {
  10.     static $conns = [];
  11.  
  12.     if(!isset($conns[$dbName])) {
  13.         extract(require("/path/to/config/db/{$dbName}.php"));
  14.         $conns[$dbName] = new mysqli($host, $user_name, $password, $dbName);
  15.         $conns[$dbName]->set_charset($charset);
  16.     }
  17.  
  18.     return $conns[$dbName];
  19. }
  20.  
  21. function myDatabase() {
  22.     return conn('my_database');
  23. }
  24.  
  25. try {
  26.     $conn = myDatabase();
  27. } catch(mysqli_sql_exception $e) {
  28.     echo 'Error: ', $e->getMessage();
  29. }
  30.  


Поправьте меня если я неправильно понимаю.

Здесь мы создаём в файле массив с переменными:
PHP:
скопировать код в буфер обмена
  1. return [
  2.     'host'      => 'localhost',
  3.     'user_name' => 'dendy',
  4.     'password'  => '12345',
  5.     'charset'   => 'utf8'
  6. ];


//Включаем расширенные сообщения по ошибкам:
PHP:
скопировать код в буфер обмена
  1. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);


//Эта функция вытаскивает значения из файла
PHP:
скопировать код в буфер обмена
  1. function conn($dbName)
  2. {
  3.     static $conns = []; - //[b]Создаём статическую переменную[/b]
  4.  
  5.     if(!isset($conns[$dbName])) { //[b]Проверяем на существование переменной базы[/b]
  6.         extract(require("/path/to/config/db/{$dbName}.php")); //[b]Извлекаем переменные из файла[/b]
  7.         $conns[$dbName] = new mysqli($host, $user_name, $password, $dbName); [b]Создаём подключение[/b]
  8.         $conns[$dbName]->set_charset($charset);//[b] Кодировка[/b]
  9.     }
  10.  
  11.     return $conns[$dbName]; //[b] Возвращаем подключение[/b]
  12. }


PHP:
скопировать код в буфер обмена
  1. function myDatabase() {
  2.     return conn('my_database');//[b]Просто возвращаем имя базы?[/b]
  3. }


Вот это для меня вообще непонятно, это всё в классе? Т.е. Мы обрабатываем исключение вызова функции myDatabase() Если там есть ошибка то выводим её на экран?
PHP:
скопировать код в буфер обмена
  1. try {
  2.     $conn = myDatabase();
  3. } catch(mysqli_sql_exception $e) {
  4.     echo 'Error: ', $e->getMessage();
  5. }


Первый раз просто сталкиваюсь с использованием extract и по этому многие моменты непонятны. Например, почему мы объявляем постоянный массив "static $conns = [];" и сразу проверяем существует ли в нём "$dbName"? Как до if(!isset($conns[$dbName])) в нём появится значение $dbName? Так же мне непонятно, почему мы присваиваем значению массива подключение к базе? "$conns[$dbName] = new mysqli($host, $user_name, $password, $dbName); "
Чёт какой то бардак в голове от данного примера. Может я конечно туплю, но я был бы очень признателен если бы вы растолковали что к чему.
ЧИМ Отправлено: 17 Февраля, 2017 - 08:44:02 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
Большое спасибо! Всё сработало! Единственное подправил строчку с определением наличия файла.
CODE (htmlphp):
скопировать код в буфер обмена
  1. require (file_exists($file) ? $file : '');

Изменил её на:
CODE (htmlphp):
скопировать код в буфер обмена
  1. require(isset($file) ? $file : '');

Потому как она постоянно говорила о том что такого файла нет и что имя файла не может быть пустым. Параметры передавал так же как и в isset. Но в isset всё заработало с этими же параметрами.
Потом перебрав все страницы и исправив везде код для создания класса, я понял что это не совсем удобно, так как в каждом файле нужно прописывать путь подключения файла, а в некоторых из них он разнится, из этого следует что может рано или поздно произойти путаница не будет доступа к файлу. В общем я решил что единственно правильным решением будет сделать единственное подключение в классе создания подключения. Теперь у меня класс выглядит так:
PHP:
скопировать код в буфер обмена
  1.  
  2. class SqlDB extends mysqli {
  3.     public function __construct() {
  4.         require_once '/config/connect.php';
  5.         $HOST  = isset($HOST) ? $HOST : '';
  6.         $LOGIN = isset($LOGIN) ? $LOGIN : '';
  7.         $PASSW = isset($PASSW) ? $PASSW : '';
  8.         $DB    = isset($DB) ? $DB : '';
  9.         $charset    = isset($charset) ? $charset : '';
  10.         parent::__construct($HOST,$LOGIN,$PASSW,$DB);
  11.         $this->set_charset($charset);
  12.         if (mysqli_connect_error()) {
  13.             die('Ошибка подключения (' . mysqli_connect_errno() . ') '
  14.                     . mysqli_connect_error());
  15.         }
  16.         $this->query('USE '.$DB.';');        
  17.     }
  18. }
  19.  

Подскажите, может какие советы будут ещё по этому классу? Здесь я не проверяю на предмет существования файла, так как уверен в его существовании и прописываю его в одном месте.
Создание нового подключения теперь происходит так:
ЧИМ Отправлено: 06 Февраля, 2017 - 12:05:54 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
А как теперь в этот класс подключить файл connect.php? Чтоб не загружать 2 файла по отдельности, а загрузить один класс который будет подключаться к БД используя файл настроек.
ЧИМ Отправлено: 27 Января, 2017 - 14:24:18 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
Нашёл всё таки самый простой класс и смог адаптировать его под себя.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class SqlDB extends mysqli {
  3.     public function __construct($HOST,$LOGIN,$PASSW,$DB,$charset='utf8') {
  4.         parent::__construct($HOST,$LOGIN,$PASSW,$DB);
  5.         $this->set_charset($charset);
  6.         if (mysqli_connect_error()) {
  7.             die('Ошибка подключения (' . mysqli_connect_errno() . ') '
  8.                     . mysqli_connect_error());
  9.         }
  10.     }
  11. }
  12.  

Осталось теперь научиться наращивать в нём функционал для дальнейших манипуляций. Например сейчас думаю о том как внедрить проверку на защиту от SQL инъекций с помощью плейсхолдеров. В сети куча готовых примеров, но тупо вставить код и надеяться что он будет работать как мне нужно не понимая сути написанного не хотелось бы. По этому хотел бы узнать, может кто кинет ссылкой(на русском) где разжёвано как правильно составлять плейсхолдеры?
ЧИМ Отправлено: 27 Января, 2017 - 11:49:17 • Тема: Как заставить класс увидеть переменные в файле? • Форум: Вопросы новичков

Ответов: 17
Просмотров: 1171
Доброго времени суток.
Пытаюсь научиться применять классы, но что то не со всем выходит.
Грубо говоря, если я делаю класс на запись в файл данных, то и потом перед вызовом класса определяю переменные которые в нём задействованы, то всё нормально.
Класс для записи в файл:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class write_connect {
  3.     public function __construct($host,$bd,$login,$passw,$file)
  4. {
  5.    
  6.     if (is_writable($file))
  7.         {
  8.         $fp= fopen($file, 'w');
  9.         $dt_con="<?php \n \$HOST='$host'; \n \$DB='$bd'; \n \$LOGIN='$login'; \n \$PASSW='$passw'; \n";
  10.        fwrite($fp, $dt_con);
  11.        
  12.        }
  13. else {
  14.            echo "Файл $file не доступен для записи!";
  15. }
  16. return;
  17. }
  18. }


Вызов класса:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. #считываем введённые данные подключения из POST
  3. $host=$_REQUEST['host'];
  4. $bd=$_REQUEST['bd'];
  5. $login=$_REQUEST['login'];
  6. $passw=$_REQUEST['passw'];
  7. $file='connect.php'; //Подключаем обработчик записи данных подключения в файл
  8. $write_file= new write_connect($host, $bd, $login, $passw, $file);
  9.  

Этот код работает исправно как я и хотел. Т.е. Есть форма мастера которая создаёт первоначальное подключение к БД и записывает его в файл connect.php.

А вот после этого необходимо из класса подключения к базе mysql увидеть переменные в этом файле и их значения.
Нашёл самый элементарный пример(на этом же форуме) и пытаюсь им воспользоваться, но с одной оговоркой, данные я хочу передать из файла который подключил через require_once 'connect.php'
Код класса:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class bd {
  3.     public function __construct($H, $L, $P, $D)
  4.             {
  5.         mysqli_connect($H, $L, $P, $D);
  6.            }  
  7. }
  8.  
  9.  


Код работы с классом:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $con=new bd($HOST, $LOGIN, $PASSW, $DB);
  3. if($con->connect_error)die ($con->connect_error);
  4. $con->set_charset("utf8");
  5.  


В итоге я вижу "Fatal error: Call to undefined method bd::set_charset() in ...\config\create_bd.php on line 16"

Подскажите как правильно подключить данные из файла для работы с классом? И правильно ли я вообще создал класс подключения к БД?
ЧИМ Отправлено: 13 Января, 2017 - 07:28:57 • Тема: Работа с данными пользователя без отправки. На PHP не возможно? • Форум: Вопросы новичков

Ответов: 6
Просмотров: 439
Что-то у меня в голове возникла мысль. Ведь можно сделать небольшое модальное окно для ввода данных, которое бы отправляло бы данные на страницу в массиве POST и тогда их можно будет прочитать. Причём модальное окно можно построить на простом html+css. Как думаете, получится такой ход?
ЧИМ Отправлено: 12 Января, 2017 - 19:19:02 • Тема: Работа с данными пользователя без отправки. На PHP не возможно? • Форум: Вопросы новичков

Ответов: 6
Просмотров: 439
mrKotik пишет:
Тебе надо просто вывести данные ниже и все? без перезагрузки страницы?

Да, вывести данные по нажатии на кнопку. в текстовое поле
(Добавление)
Heavenanvil пишет:
А что на счёт JS?
Или вам нужно именно php?

Хотелось бы именно на PHP решить эту задачу если это вообще возможно, но что то мне кажется что у PHP нет таких возможностей, ведь он больше серверный язык, и данные пользователя обрабатывает в основном после попадания на сервер.
ЧИМ Отправлено: 12 Января, 2017 - 18:24:25 • Тема: Работа с данными пользователя без отправки. На PHP не возможно? • Форум: Вопросы новичков

Ответов: 6
Просмотров: 439
Сейчас пытаюсь вывести в текстовое поле данные введённые на этой же странице, но без отправки, данные не попадают в пост, следовательно до данных средствами PHP нельзя добраться, правильно я понимаю?
Вот простой пример(здесь всё работает, но то как это работает, к сожалению меня не устраивает):
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <html>
  3.     <head>
  4.         <meta charset="UTF-8">
  5.         <title></title>
  6.     </head>
  7.     <body>
  8.         <form action="" method="POST">
  9.         Введите первое значение: <input type="text" style="width: 90px" name="tx1"><br><br>
  10.        
  11.         Введите второе значение: <input type="text" style="width: 90px" name="tx2"><br><br>
  12.         <input type="submit" value="Внести данные в текстовое поле" name="but"><br><br>
  13.         <textarea  style="width: 500px; height: 100px" >
  14.             <?php
  15.            echo "Первое значение: ".$_REQUEST['tx1']."\n ";
  16.            echo "Второе значение: ".$_REQUEST['tx2']."\n ";
  17.            ?>
  18.         </textarea>
  19.         </form>        
  20.     </body>
  21. </html>
  22.  


Если данные не отправлять, то считать данные после ввода из текстовых полей возможно средствами одного только PHP?
Может есть какие нибудь хитрости позволяющие воспользоваться кнопкой <input type="button" onclick=""> ? для того чтобы по нажатию на неё осуществить считывание данных которые пользователь занёс в поля?
ЧИМ Отправлено: 14 Декабря, 2016 - 06:56:34 • Тема: Отправная форма • Форум: Вопросы новичков

Ответов: 1
Просмотров: 147
Возможно я ошибаюсь, но по крайней мере на Linux не достаточно просто написать скрипт для отправки письма, так как должен быть ещё в локальной системе SMTP сервер. На счёт Windows и денвер не могу сказать. Хотел спросить, в contact.php какая инфа находится?
ЧИМ Отправлено: 13 Декабря, 2016 - 20:36:53 • Тема: Поле с кнопкой вызова диалогового окна. • Форум: Вопросы новичков

Ответов: 5
Просмотров: 310
Строитель пишет:
ЧИМ пишет:
Грубо говоря, я вызываю окно с таблицей в которую я хочу передать поле из таблицы
Для начала, смените расширение файла с *.html на *.php , а дальше уже определите в вашей форме метод передачи данных (GET или POST), и на основе этого уже работайте с соответствующим выбору суперглобальным массивом. Скорее всего вам нужен будет $_POST.

Да не, вы не правильно поняли. Я привёл здесь просто кусок кода который я только начал, сохранён он с расширением *.php. Передавать данные я буду естественно через POST, но беспокоит меня сейчас совсем не это. Я уже понял как сделать кнопку в поле которая будет создавать диалоговое окно, но как создать обработчик события двойного клика из диалогового окна по которому содержимое поля таблицы из одной строки добавляется в таблицу первой страницы.
ЧИМ Отправлено: 12 Декабря, 2016 - 22:39:12 • Тема: Поле с кнопкой вызова диалогового окна. • Форум: Вопросы новичков

Ответов: 5
Просмотров: 310
Строитель пишет:
ЧИМ, вам наверное нужен тег <select>? Посмотрите тут http://htmlbook[dot]ru/html/select

Ну <select> это уже на крайний случай потому как не совсем удобно будет.
Меня интересует примерно вот такая конструкция:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE html>
  3. <html>
  4.  <head>
  5.      <link rel="stylesheet" type="text/css" href="pol_but.css">
  6.   <meta charset="utf-8">
  7.   <title></title>
  8.  
  9.   </head>
  10.  <body>
  11.   <form>
  12.       <table class="mr" >
  13.           <tr>
  14.               <td><input type="text" name="q">
  15.                   <input type="submit" value="..." ></td>
  16.      </tr>
  17.      </table>
  18.   </form>
  19.  </body>
  20. </html>
  21.  


и css
CODE (css):
скопировать код в буфер обмена
  1.  
  2. .mr {
  3.     width: auto; /* Ширина поля с кнопкой */
  4.     border: 1px solid #000; /* Параметры рамки */
  5.     min-height: 20px; /* Минимальная высота */
  6.    
  7.    }
  8.    input[type="text"] {
  9.     width: 300px; /* Ширина поля */
  10.     vertical-align: middle; /* Выравнивание по середине */
  11.     border-width:  1px;
  12.     border-color: #000;    
  13.    }
  14.    input[type="submit"] {
  15.     width: 27px; /* Ширина кнопки */
  16.     height: 20px; /* Высота кнопки */
  17.     vertical-align: middle;
  18.  
  19.    }
  20.  

Из этого получается конструкция которая мне нужна, только вот непонятно что делать после того как я вызову диалоговое окно по нажатию кнопки.
Грубо говоря, я вызываю окно с таблицей в которую я хочу передать поле из таблицы(справочника с наименованиями) mysql, поля заполняются до тех пор пока все данные из таблицы mysql не будут перенесены. После этого я выбираю нужную мне строчку и двойным нажатием добавляю её в поле ввода на первой форме, после чего диалоговое окно закрывается и я продолжаю работать с первой формой.
ЧИМ Отправлено: 12 Декабря, 2016 - 20:00:26 • Тема: Поле с кнопкой вызова диалогового окна. • Форум: Вопросы новичков

Ответов: 5
Просмотров: 310
Доброго времени суток!
Пытаюсь понять как создать поле ввода с кнопкой на подобии стиля 1С, я так понимаю готового элемента такого вида не существует? По крайней мере в input я такого не нашёл. Может есть мысли как в текстовом поле создать кнопку которая бы открывала диалоговое окно выбора записи по нажатию на которую эта запись добавлялась бы в таблицу?
Я понимаю что это большая часть кода и скорее всего здесь потребуется JS, но может хотя бы намекнёте куда копать? Как создать такой элемент? У меня конечно есть мысли создать этот элемент с помощью 2ух input текстового и кнопки и с помощью стилей css наложить один элемент на другой, но может есть более правильный способ? А на счёт диалогового окна, я так понимаю что там должна срабатывать обработка дабл-клик, но как вычислить позицию в таблице на которую я нажимаю? Может при выборе SELECT из базы значениям присваивать ссылки типа <a href... хотя если честно в голове конструкция не представляется. Подскажите пожалуйста где копать, может кто куском кода может поделиться чтоб я в нём покопался и вынес для себя что нибудь полезное. За ранее благодарен всем кто откликнется!

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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB