Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Запросы через MySQLi, тренировка
Astin  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Решил сделать для себя сайтик, ну так скажем почти сделал, сейчас потихоньку
допиливаю.

Решил сделать его работу с бд на MySQLi, все равно рано или поздно придется
переделывать на MySQLi если сайт будет работать на MySQL, ну и штоб не делать
двойную работу решил подучить то расширение

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

Седня вечером решил боле сложные для себя запросы написать

1) Запрос на создание таблицы, если нету такой то создаем, если есть то показяваем
сообщение что есть такая
2) Удаление таблицы, если есть такая то удаляем, если нет такой то показываем
сообщение что нет такой
3) Добавление или обновление данных в таблице. Здесь я добавляю данные в
созданную таблицу из другой таблицы, но если такие данные есть то просто их
обновляем

Для работы с БД использую класс Twina, правда поменял под себя
всего пару строк в классе

Ну и вот что вышло

$tabl = 'a_dd';

// Создаем таблицу

if (isset($_POST['sbr'])) //Если нажата кнопка
{
$resul = DB::Query("SHOW TABLES LIKE '$tabl'"); //Запрос на существование таблицы

$rowt = $resul->num_rows;

if ($rowt > 0) //Если в таблице строк больше 0 то сообщаем что такая таблица уже есть
{
echo 'Есть таблица - '.$tabl;

} else { //Если такой таблицы нет создаем ее

DB::Query("CREATE TABLE IF NOT EXISTS `".$tabl."` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`entitl` varchar(200) NOT NULL,
`descrip` varchar(255) NOT NULL,
`keywor` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8"
);

echo 'Таблица - '.$tabl.' создана';
}
}

//===================================================
// Удаление таблицы


if (isset($_POST['delet'])) //Если нажата кнопка
{
$res = DB::Query("SHOW TABLES LIKE '$tabl'"); //Запрос на существование таблицы

$rowt = $res->num_rows;

if ($rowt > 0) //Если в таблице строк больше 0 то удаляем таблицу
{
DB::Query("DROP TABLE `".$tabl."`");

echo 'Таблица - '.$tabl.' удалена';

} else {

echo 'Таблицы - '.$tabl.' НЕ Существует';
}
}


//===================================================
// Добавление или обновление данных в таблице


if (isset($_POST['editin'])) //Если нажата кнопка
{
$query = "INSERT INTO `".$tabl."` (id, title, entitl, descrip, keywor)
SELECT `id`, `title`, `entitl`, `descrip`, `keywor` FROM `a_meta`
ON DUPLICATE KEY UPDATE `"
.$tabl."`.`id` = `a_meta`.`id`";

//подготавливаем запрос
$stmt = DB::$link->prepare($query);

//выполняем запрос
$stmt->execute();

if ($stmt->affected_rows > 0)
{
echo 'Изменено '.$stmt->affected_rows.' записей';

} else {

echo 'Записи НЕ изменены';
}
}


Мне больше интересен третий запрос вот в чем.
Для того чтоб получить количество затронутых строк приходится использовать
еще две функции
mysqli_prepare — Подготавливает SQL выражение к выполнению
и
mysqli_stmt_execute() - Выполняет подготовленный запрос

Когда ка в MSQL можно воспользоваться всего то mysql_affected_rows()

И вот теперь мне интересно вообще можно ли обойтись без этих двух
функций и кто нибудь может объяснить поконкретнее значимость тих двух
функций, а то читаю мануал ну и вроде как понятно что они нужны, но не
пойму их значимость.

И еще, про эти три запроса, правильно ли написаны или что то нужно изменить
или мож поправить

_
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4284
Пользователь №: 29002
На форуме: 5 лет, 7 месяцев, 28 дней
Карма: 147




какой-то совершенно не нужный функционал. где в реальности подобное может вообще понадобиться?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Часть из этого мне будет нужна для сайта. Я делаю партнерский интернет магазин.
Просто в ихнем xml файле не все данные и в ихнем скрипте не весь код только расчитан на
их xml файл, нужно будет добовлять данные и таблицы.
К тому же может не только я захочу такой сайт, а тут раз и все более автоматизировано, чтоб вручную не лезть в код. Заодно и тренируюсь и почему бы нет
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15911
Пользователь №: 6543
На форуме: 8 лет, 5 месяцев, 26 дней
Карма: 300

Трезвый :
6 лет, 3 месяца, 4 дня


Для чего тут подготавливается запрос? Вернее он тут не совсем и подготавливается.

Подготовленные запросы нужны для того, чтобы, собрав его единожды, применять в разных местах с разными данными.

Как побочное явление, его стало модно использовать, как некую мифическую защиту от инъекций. У тебя нет ни того ни другого. Здесь нужно просто его выполнить с помощью query() и вся недолга. Остальное все лишнее.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Цитата
У тебя нет ни того ни другого

А чего именно у меня нет?

Это я просто тренировался, получится у меня сделать или нет. Получилось, но по
третьему запросу, если убрать
$stmt = DB::$link->prepare($query);

//выполняем запрос
$stmt->execute();

То
$stmt->affected_rows

не срабатывает вообще
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Мне был интересен ответ про
Цитата
Для того чтоб получить количество затронутых строк приходится использовать
еще две функции
mysqli_prepare — Подготавливает SQL выражение к выполнению
и
mysqli_stmt_execute() - Выполняет подготовленный запрос

Когда ка в MSQL можно воспользоваться всего то mysql_affected_rows()

Цитата
И вот теперь мне интересно вообще можно ли обойтись без этих двух
функций и кто нибудь может объяснить поконкретнее значимость тих двух
функций, а то читаю мануал ну и вроде как понятно что они нужны, но не
пойму их значимость.

И что подготавливать для этих запросов?
В первом запросе я проверяю на существование таблицы и если нет то создаю ее

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

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

_
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15911
Пользователь №: 6543
На форуме: 8 лет, 5 месяцев, 26 дней
Карма: 300

Трезвый :
6 лет, 3 месяца, 4 дня


Причем тут запросы. Запросы у тебя в порядке. Ты неверно используешь функции драйвера.

prepare - в переводе с английского - подготовить.
exequte - исполнить

Что именно ты подготовил? Где подстановки?

Ты пытаешься выполнить обычный, не подготавливаемый, запрос с помощью этих двух функций. Дык зачем мудрить, когда есть обычная query(). Ровно как и в mysql_. И после неё спокойно видно affected_rows.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




twin запрос я писал по примеру из мануала, ну и получилось то что получилось

Сейчас попробую исправить и посмотрю что получилось.

А можно по подробнее про
prepare - в переводе с английского - подготовить.
exequte - исполнить

Для чего и где их лучше использовать
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Попробовал написать так
if (isset($_POST['editin'])) //Если нажата кнопка
{

$stmt = DB::Query("INSERT INTO `".$tabl."` (id, title, entitl, descrip, keywor)
SELECT `id`, `title`, `entitl`, `descrip`, `keywor` FROM `a_meta`
ON DUPLICATE KEY UPDATE `"
.$tabl."`.`id` = `a_meta`.`id`");


if ($stmt->affected_rows > 0)
{
echo 'Изменено '.$stmt->affected_rows.' записей';

} else {

echo 'Записи НЕ изменены';
}
}

Данные естественно обновляет и если нужно добавить добавляет, но affected_rows
не видит

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Делал по примеру как в мануале написано вот здесь http://php.net/manual/ru/mysqli-stmt.affected-rows.php

Но без
prepare - в переводе с английского - подготовить.
exequte - исполнить

не видит affected_rows
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15911
Пользователь №: 6543
На форуме: 8 лет, 5 месяцев, 26 дней
Карма: 300

Трезвый :
6 лет, 3 месяца, 4 дня


Цитата
Для чего и где их лучше использовать


Подготавливаемое выражение используется тогда, когда нужно выполнить несколько одинаковых запросов с разными данными. Это для того, чтобы не переписывать его несколько раз. Кроме того, выражение передается на сервер СУБД тоже один раз, потом передаются только переменные.

Допустим так (обрати внимание на вопросик):

$stmt = DB::$link->prepare("SELECT * FROM `table` WHERE `id` = ?");
$stmt->bind_param('i', $id);

$id = 1;
$stmt->exequte();
// тут получаем результат для id = 1
$id = 2;
$stmt->exequte();
// тут получаем результат для id = 2


Сейчас почему то модно использовать подготовленные выражения для защиты от SQL-инъекций. Считается, что круче прописать тип параметра в биндер, нежели заэскейпить его руками. Скорее всего пошло это от того, что с чьей то "легкой" руки заменили слово "выражение" на "запрос". И стали считать, что запрос офигительно подготовлен для отражения злобных атак хакеров.

На вкус и цвет все фломастеры разные, как говорится. На мой взгляд это извращение, так как уменьшает читабельность. И если в PDO это еще как то терпимо с его плэйсхолдерами, то в mysqli_ - полный бред.

Что касается affected_rows, то его нужно смотреть не в $stmt, а в объекте mysql в твоем случае:
echo $link->affected_rows;


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Благодарю за хорошее пояснение twin

Решил поискать тоже инфу про prepare. Понял так что если использовать prepare, то
никакой mysqli_real_escape_string не нужен.
Короче два одинаковых варианта это:

1) mysqli_query и mysqli_real_escape_string
2) mysqli_stmt_prepare

Для простой выборки из бд думаю что mysqli_stmt_prepare это лишнее, роще будет
использовать mysqli_query. А prepare скорее можно использовать к примеру для поиска,
ну или для добавления данных в бд. Но если использовать prepare, то читабельность
кода ухудшается и его становится больше. Хотя можно для всех запросов использовать
mysqli_query, ну и там где нужно используем mysqli_real_escape_string и (int), не зря
же их все таки придумали.
Да и читабельность кода с mysqli_query получше будет. Ну и думаю если использовать
mysqli_query и грамотно подготовить запрос, то никакого prepare и не нужно будет.
Хотя здесь наверно будет иметь место ситуация, где мож лучше будет использовать
prepare

И еще раз благодарю за пояснение про affected_rows. Честно говоря нигде не нашел
чтобы говорилось что можно смотреть в
$link->affected_rows;

Везде в примерах используют prepare для того чтоб увидеть кол-во затронутых
строк. Ну и получился вот такой код

if (isset($_POST['editin'])) //Если нажата кнопка
{

DB::Query("INSERT INTO `".$tabl."` (id, title, entitl, descrip, keywor)
SELECT `id`, `title`, `entitl`, `descrip`, `keywor` FROM `a_meta`
ON DUPLICATE KEY UPDATE `"
.$tabl."`.`id` = `a_meta`.`id`");

if (DB::$link->affected_rows > 0)
{
echo 'Изменено '.DB::$link->affected_rows.' записей';

} else {

echo 'Записи НЕ изменены';
}
}


_
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15911
Пользователь №: 6543
На форуме: 8 лет, 5 месяцев, 26 дней
Карма: 300

Трезвый :
6 лет, 3 месяца, 4 дня


Только если ты используешь объектный интерфейс, то $link как то неуместно. Лучше переименовать в тот же $mysqli


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 1 месяц, 17 дней
Карма: 7




Цитата
Только если ты используешь объектный интерфейс, то $link как то неуместно. Лучше переименовать в тот же $mysqli

Моет и не уместно, класс для работы с бд как раз таки делал ваша программа twin.

Да, наверно изменю, с $mysqli как то понятнее чем с $link
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15911
Пользователь №: 6543
На форуме: 8 лет, 5 месяцев, 26 дней
Карма: 300

Трезвый :
6 лет, 3 месяца, 4 дня


Цитата (Astin @ 22.06.2016 - 13:16)
Моет и не уместно, класс для работы с бд как раз таки делал ваша программа twin.

У меня в классе используется процедурный интерфейс. Там оно к месту. Но там нет никаких $stmt smile.gif И если их юзать (объектный интерфейс), то лучше переименовать.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса