PHP.SU

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

Страниц (13): [1] 2 3 4 5 6 7 8 9 ... » В конец

> Найдено сообщений: 191
gheka Отправлено: 27 Декабря, 2017 - 02:12:48 • Тема: Вывод названия во iframe fancybox • Форум: JavaScript & VBScript

Ответов: 0
Просмотров: 710
Здравствуйте, использую fancybox 3, но столкнулся с проблемой, не могу ни как понять как вывести название во открывшимся iframe. Нигде об этом информации не нашел.
Содержимое открывается, с этим проблем нет, но вот, что нужно в писать в параметры, что бы вывести TITLE никак не пойму.

В моём случае это title="name iframe"
Делаю так.

ссылка:

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.  
  3. <a data-fancybox data-type="iframe" title="name iframe" data-src="depositphotos_25226481-Video-audio-and-multimedia-buttons-set.jpg" href="javascript:;">
  4.     External page
  5.   </a>
  6.  


Параметры:

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. $("[data-fancybox]").fancybox({
  3.         toolbar  : false,
  4.         smallBtn : true,
  5.         autoSize: true,
  6.         helpers : {
  7.                         title   : {
  8.                                 show_title: true,
  9.                                 type : 'inside'
  10.                         },
  11.                         buttons : {}
  12.                 },     
  13.         iframe : {
  14.                 css : {
  15.                 }
  16.                
  17.         },
  18. });
  19.  


Подскажите пожалуйста, всё голову уже сломал.
gheka Отправлено: 09 Декабря, 2016 - 21:51:41 • Тема: Составить запрос на выборку • Форум: Вопросы новичков

Ответов: 6
Просмотров: 235
Вообщем нашёл решение сам, выкладываю может кому пригодится.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM `user` WHERE FIND_IN_SET(5, role)=0
  3.  


Сразу скажу это не лучший вариант если выборка будет производиться с таблицей с большим количеством строк (записей)

В моём случае записей будет максимум 50-70 поэтому для меня это решение лучше чем создавать дополнительные 2 связующие таблицы.
gheka Отправлено: 09 Декабря, 2016 - 18:03:22 • Тема: Составить запрос на выборку • Форум: Вопросы новичков

Ответов: 6
Просмотров: 235
Мелкий пишет:
Нормальная форма - это такой термин в реляционных СУБД.

Попытка записать что-нибудь в одно поле через разделитель приносит только головную боль в дальнейшем.


Ну даже не знаю, никаких проблем у меня с эти раньше не возникало, делал элементарно.

Получал данные из поля таблицы пример поле USER_ID (6,8,9,5)

PHP:
скопировать код в буфер обмена
  1. //Переводил строку в массив
  2. $array_id = explode ( ',', USER_ID )
  3.  
  4. // И осуществлял поиск
  5. if ( !in_array ( 6, $array_id ) {
  6.    // нет такого значения.
  7. }


но тут такой вариант не совсем подходит
gheka Отправлено: 09 Декабря, 2016 - 17:40:09 • Тема: Составить запрос на выборку • Форум: Вопросы новичков

Ответов: 6
Просмотров: 235
Мелкий пишет:
Приведите в нормальную форму и будет элементарно.


Честно не понял о чём вы?
gheka Отправлено: 09 Декабря, 2016 - 17:12:30 • Тема: Составить запрос на выборку • Форум: Вопросы новичков

Ответов: 6
Просмотров: 235
Здравствуйте.

Не знаю можно ли составить такой запрос или нет, надеюсь можно.

Есть таблица USER
с полями id, name и role

в поле ROLE записываются набор чисел через запятую (пример 2,5,33,66)


И суть такая нужно составить запрос что бы можно было вывести всех пользователей из таблицы USER где например ROLE не равняется 5

Этот запрос естественно не подходит
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM `user` WHERE `role`!=5
  3.  


Подскажите можно ли составит такой запрос?
gheka Отправлено: 20 Ноября, 2016 - 13:55:18 • Тема: Блокировка выполнения транзакции до её завершения • Форум: Вопросы новичков

Ответов: 6
Просмотров: 388
Спасибо, да действительно то что нужно SELECT FOR UPDATE.
gheka Отправлено: 19 Ноября, 2016 - 13:05:07 • Тема: Блокировка выполнения транзакции до её завершения • Форум: Вопросы новичков

Ответов: 6
Просмотров: 388
Мелкий пишет:
gheka пишет:
Как в этом случае?

Вы обязаны перенести запрос, на основании данных которого определяется дальнейшая логика в транзакцию и захватывать необходимые блокировки.
Т.е. этот пример идентичен предыдущему и безопасный для конкурентного доступа код будет идентичен.



К примеру есть страница такая.
В комментариях указаны этапы


PHP:
скопировать код в буфер обмена
  1.  
  2. // ------------ 1 ЭТАП ------------
  3. // Проверяем есть ли открытые банки
  4. $sql = "SELECT `id`,`sum` FROM `bank` WHERE `status`=? LIMIT 0,1";
  5. $stmt = $dbh->prepare ( $sql );
  6. $stmt->execute ( array ( 1 ) );
  7.  
  8. if ( $rows = $stmt->fetch ( PDO::FETCH_NUM ) ) {
  9.         // Если есть выводим кнопку ПОЛУЧИТЬ БАНК
  10.         $id = $rows [0]; // К промеру ID 100
  11.         $sum = $rows [1]; // К примеру сумма 500
  12.  
  13.  
  14.  
  15.         // ВЫВОДИМ КНОПКУ
  16.                 echo "<form action='' method='post'>
  17.                 <input type='submit' name='receive_bonus' value='ПОЛУЧИТЬ БАНК'>
  18.                 </form>";
  19.                
  20.                
  21.                
  22.                 // ------------ 2 ЭТАП ------------
  23.                 // Проверим нажал ли пользователь кнопку
  24.                 if ( $_POST ['receive_bonus'] == TRUE ) {
  25.                
  26.                         try {
  27.                                   /* Начало транзакции, отключение автоматической фиксации */
  28.                                   $dbh->beginTransaction();
  29.                                                          
  30.                                   // ------------ 3 ЭТАП ------------
  31.                                   // Пополняем баланс пользователя который нажал кнопу
  32.                                   $sql = "UPDATE `user` SET `balanse`=balanse+? WHERE `id`=?";
  33.                                   $stmt = $dbh->prepare ( $sql );
  34.                                   $stmt->execute ( array ( $sum, $id_user ) );
  35.                          
  36.                                  
  37.                          
  38.                                   // ------------ 4 ЭТАП ----------------------
  39.                                   // Обновляем статус на 0 (банк закрыт)
  40.                                   $sql = "UPDATE `bank` SET `status`=? WHERE `id`=?";
  41.                                   $stmt = $dbh->prepare ( $sql );
  42.                                   $stmt->execute ( array ( 0, $id ) );
  43.                                          
  44.                                   /* Фиксация изменений */
  45.                                   $dbh->commit();
  46.                         }
  47.                          
  48.                         catch ( Exception $e ) {
  49.                          
  50.                                 $dbh -> rollBack ();
  51.                                 die ("Ошибка : " . $e -> getMessage ());
  52.                         }
  53.                 }
  54. } else {
  55.         echo "НЕТ ОТКРЫТЫХ БАНКОВ";
  56. }
  57.  


И Если допустим 2 пользователя зашли на страницу получения банка
Тоесть выполнился 1 этап

Они одновременно нажали на кнопку ПОЛУЧИТЬ БАНК

SELTCT выполнился и пустил обоих на 2-3 этап (Так как банк ещё открыт)

то обоим пользователям зачислится на баланс 500 руб

И только после этого выполнится 4 этап обновится статус банка на 0 (закрыт)
gheka Отправлено: 19 Ноября, 2016 - 08:40:08 • Тема: Блокировка выполнения транзакции до её завершения • Форум: Вопросы новичков

Ответов: 6
Просмотров: 388
Мелкий пишет:
SELECT ... FOR UPDATE
Захватит эксклюзивную блокировку на строку, соответственно до завершения этой транзакции остальные update или select for update (а так же select for share) будут ждать завершения транзакции.



Ну в этом примере да. Но это просто тестовый пример. Может быть и другие варианты.

Вот пример где SELECT не задействован в транзакции

PHP:
скопировать код в буфер обмена
  1.  
  2. // Статус 1 (открыт)
  3. $sql = "SELECT `id`,`sum` FROM `bank` WHERE `status`=? LIMIT 0,1";
  4. $stmt = $dbh->prepare ( $sql );
  5. $stmt->execute ( array ( 1 ) );
  6.  
  7. if ( $rows = $stmt->fetch ( PDO::FETCH_NUM ) ) {
  8.         $id_invoice = $rows [0];
  9.         $sum = $rows [1];
  10.  
  11.         try {
  12.                         /* Начало транзакции, отключение автоматической фиксации */
  13.                         $dbh->beginTransaction();
  14.                                    
  15.                         $sql = "UPDATE `user` SET `balanse`=balanse+? WHERE `id`=?";
  16.                         $stmt = $dbh->prepare ( $sql );
  17.                         $stmt->execute ( array ( $sum, $id_user ) );
  18.                    
  19.                         // ДРУГИЕ ДЕЙСТВИЕ
  20.                    
  21.                         // Обновляем статус на 0 (закрыт)
  22.                         $sql = "UPDATE `bank` SET `status`=? WHERE `id`=?";
  23.                         $stmt = $dbh->prepare ( $sql );
  24.                         $stmt->execute ( array ( 0, $id_invoice ) );
  25.                            
  26.                         /* Фиксация изменений */
  27.                         $dbh->commit();
  28.         }
  29.          
  30.         catch ( Exception $e ) {
  31.          
  32.                         $dbh -> rollBack ();
  33.                         die ("Ошибка : " . $e -> getMessage ());
  34.         }
  35. }
  36.  



Как в этом случае?
gheka Отправлено: 18 Ноября, 2016 - 23:43:12 • Тема: Блокировка выполнения транзакции до её завершения • Форум: Вопросы новичков

Ответов: 6
Просмотров: 388
Здравствуйте

Есть транзакция с выполнением нескольких запросов подряд.

Суть примера такая.
Есть таблица bank с полями
id
sum Сумма банка

тип таблиц InnoDB


Любой авторизованный пользователь нажимает на кнопку ПОЛУЧИТЬ БАНК и выполняется скрипт ниже

ПРИМЕР

PHP:
скопировать код в буфер обмена
  1.  
  2. try {
  3.         /* Начало транзакции, отключение автоматической фиксации */
  4.         $dbh->beginTransaction();
  5.        
  6.         // Статус 1 (открыт)
  7.         $sql = "SELECT `id`,`sum` FROM `bank` WHERE `status`=? LIMIT 0,1";
  8.         $stmt = $dbh->prepare ( $sql );
  9.         $stmt->execute ( array ( 1 ) );
  10.        
  11.         if ( $data = $stmt->fetchAll ( PDO::FETCH_NUM ) ) {
  12.                 $id_invoice = $rows [0];
  13.                 $sum = $rows [1];
  14.                
  15.                 $sql = "UPDATE `user` SET `balanse`=balanse+? WHERE `id`=?";
  16.                 $stmt = $dbh->prepare ( $sql );
  17.                 $stmt->execute ( array ( $sum, $id_user ) );
  18.                
  19.                 // ДРУГИЕ ДЕЙСТВИЕ
  20.                
  21.                 // Обновляем статус на 0 (закрыт)
  22.                 $sql = "UPDATE `bank` SET `status`=? WHERE `id`=?";
  23.                 $stmt = $dbh->prepare ( $sql );
  24.                 $stmt->execute ( array ( 0, $id_invoice ) );
  25.         }                              
  26.         /* Фиксация изменений */
  27.         $dbh->commit();
  28. }
  29.  
  30. catch ( Exception $e ) {
  31.  
  32.         $dbh -> rollBack ();
  33.         die ("Ошибка : " . $e -> getMessage ());
  34. }
  35.  
  36.  


Тоесть выполняется запрос в базу bank и вытаскивается первая попавшееся запись со СТАТУСОМ 1 (статус 1 - банк открыт, статус 0 - банк закрыт)

Сумма из этого банка зачисляется на счёт этого пользователя.
После чего банк закрывается Статус банка с определённый id обновляется на 0


ВОПРОС

Мне нужно защитить данную транзакцию от двойной записи.
тоесть если 2 пользователя одновременно нажмут на кнопку ПОЛУЧИТЬ БАНК то один и тот же банк может зачислится обоим пользователям.
В том случае если транзакция не успеет завершится и статус таблицы bank ещё не изменится на 0


Надеюсь я понятно объяснил что я хочу.
Подскажите каким образом мне это сделать?

Читал про уровни изоляции

READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

но как их применить так и не понял.
gheka Отправлено: 23 Апреля, 2016 - 23:53:07 • Тема: Формирование подписи INTERKASSA • Форум: Вопросы новичков

Ответов: 5
Просмотров: 907
shevket пишет:
gheka пишет:
Проблема решена тему можно закрыть


ТОЧНО такая же проблема. Пожалуйста, подскажите в чём ошибку допускаем?


видимо не правильно всё таки формовал подпись в файле RESULT

Сделал так.

PHP:
скопировать код в буфер обмена
  1.  
  2. $LMI_HASH = isset ( $_POST ['ik_sign'] ) ? strval ( $_POST ['ik_sign'] ) : '';
  3. $dataSet = $_POST; // Записываем в переменную $dataSet полученный массив от interkassa
  4. unset ( $dataSet['ik_sign'] ); // Удаляем из массива строку ik_sign
  5. ksort ( $dataSet, SORT_STRING ); // Сортирует массив по ключам
  6. array_push ( $dataSet, $SecretKeyInterkassa ); // Добавляет СЕКРЕТНЫЙ КЛЮЧ INTERKASSA в конец массива
  7. $signString = implode ( ':', $dataSet ); // Объединяет элементы массива в строку через : (двоеточие)
  8. $code = base64_encode ( hash ( 'sha256', $signString, true )); // кодирует данные способом MIME base64. Алгоритм формирования подписи sha256
  9.  
  10. // Сверяем подписи
  11. if ( strtolower ( $code ) == strtolower ( $LMI_HASH )) {
  12. // Верная подпись продолжаем выполнение скрипта
  13. } else {
  14. // Не верная подпись, останавливаем работу скрипта
  15. }
  16.  
  17.  


И ВСЁ ЗАРАБОТАЛО.
gheka Отправлено: 22 Февраля, 2016 - 04:01:42 • Тема: Вопрос по защите от sql инекции • Форум: Работа с СУБД

Ответов: 1
Просмотров: 581
Здравствуйте
Вопрос такой.
Какой запрос безопаснее 1 или 2 или разници нет?

1 запрос
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $name = 'Миша'
  3. $city = 'Москва';
  4. $STH = $DBH->("INSERT INTO folks (name, city) value (:name, :city)");
  5. $data = array( 'name' => $name, 'city' => $city );
  6. $STH->execute($data);  
  7.  


2 запрос
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $name = 'Миша'
  3. $city = 'Москва';
  4. $STH = $DBH->("INSERT INTO folks (name, city) value (?, ?)");
  5. $data = array( $name, $city );
  6. $STH->execute($data);
  7.  
gheka Отправлено: 07 Февраля, 2016 - 14:31:29 • Тема: Проверка существования таблицы в базе данных. PDO • Форум: Вопросы новичков

Ответов: 5
Просмотров: 1813
re_nat пишет:
А головой подумать?
PHP:
скопировать код в буфер обмена
  1. $res = $dbh->query('SHOW TABLES LIKE "user"');
  2. var_dump($res->rowCount());


Спасибо работает.
gheka Отправлено: 06 Февраля, 2016 - 17:54:31 • Тема: Проверка существования таблицы в базе данных. PDO • Форум: Вопросы новичков

Ответов: 5
Просмотров: 1813
re_nat пишет:
SHOW TABLES LIKE 'user'


Можете привести пример.

Если так то не работает

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $table = 'user';
  3. $sql = "SHOW TABLES LIKE `" . $table . "`";
  4. $stmt = $dbh->query( $sql );
  5.  
  6. IF ( $stmt ) {
  7. RETURN TRUE; // Если есть таблица
  8. } else {
  9. RETURN FALSE; // Если нет таблицы
  10. }
  11.  
gheka Отправлено: 05 Февраля, 2016 - 23:09:36 • Тема: Проверка существования таблицы в базе данных. PDO • Форум: Вопросы новичков

Ответов: 5
Просмотров: 1813
Здравствуйте.

Подскажите пожалуйста как проверить наличие таблицы в базе данных средствами PDO?

Раньше работал с просто mysqli и проверял так

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $table = 'user';
  3. $res = mysqli_query ( $LinkToBD, "SELECT * FROM `" . $table . "` LIMIT 1");
  4. $error = mysqli_errno( $LinkToBD );
  5. RETURN ($error != '1146' && $res = true);
  6.  


А теперь перехожу на PDO
и не как не могу понять как реализовать подобное в PDO

что бы при наличии такой таблицы возвращало например TRUE а при отсутствии FALSE

Делаю так:

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $table = 'user';
  3. $sql = "SELECT * FROM `" . $table . "` LIMIT 1";
  4. $stmt = $dbh->query( $sql );
  5.  
  6. $stmt->errorCode();
  7.  


Но так получается если такая таблица есть то выводит 00000 а если нет то фатальную ошибку.
(Добавление)

Нашёл некоторое решения.

Может кому пригодится.

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $table = 'user';
  3. $sql = "SELECT 1 FROM `" . $table . "` LIMIT 1";
  4. $stmt = $dbh->query( $sql );
  5.  
  6. IF ( $stmt ) {
  7. RETURN TRUE; // Если есть таблица
  8. } else {
  9. RETURN FALSE; // Если нет таблицы
  10. }
  11.  


Если есть более правильный вариант напишите.
gheka Отправлено: 26 Ноября, 2015 - 01:08:41 • Тема: защита от sql инъекции • Форум: Вопросы новичков

Ответов: 3
Просмотров: 164
DeepVarvar пишет:
PDO + prepared statement
(Добавление)
В майскули препаред тоже есть.


Но это решение для запроса написанного другим способом.
У меня процедурный стиль и в этом случае подготовку запроса не выполнить. Или я не прав?
Подскажите пожалуйста.

Страниц (13): [1] 2 3 4 5 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB