Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вопрос по циклу
Форумы портала PHP.SU » » Вопросы новичков » Вопрос по циклу

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

1. Nizz - 31 Июля, 2017 - 16:23:02 - перейти к сообщению
Здравствуйте. Подскажите пожалуйста по циклу с изменяющейся переменной.
Есть код :
PHP:
скопировать код в буфер обмена
  1.  
  2. function getproductsByIds($IdsArray) {
  3.    global $GetPage;
  4.    $products = array() ;
  5.    $db = getPDOconnect ();
  6.  
  7.    $idsString = implode(',', $IdsArray);
  8.    $sql = "SELECT `id`, `name`, `articl`, `price` FROM $GetPage WHERE id IN ($idsString)";
  9.    $result = $db->query($sql);
  10.    $result->setFetchMode(PDO::FETCH_ASSOC);
  11.    
  12.    $i = 0;
  13.    while ($row = $result->fetch()) {
  14.  
  15.          $products[$i]['id'] = $row['id'];
  16.           $products[$i]['name'] = $row['name'];
  17.            $products[$i]['price'] = $row['price'];
  18.         $products[$i]['articl'] = $row['articl'];
  19.            $i++;
  20.            
  21.            print_r ($row);
  22.        
  23.  
  24.  
  25.    }
  26.    
  27.  
  28.   return $products;
  29.  
  30.  
  31.  }
  32.  


Суть: переменная $GetPage изменяется в зависимости от имени таблицы к которой я подключаюсь. Но как вы могли догадаться, все данные внутри цикла, переписываются каждый раз под эту переменную. Можно ли написать цикл так, что бы сохранялись эти значения и к ним прибавлялись данные из другой таблицы ? Если да, то подскажите пожалуйста, как это сделать ?
2. Строитель - 31 Июля, 2017 - 16:56:09 - перейти к сообщению
Nizz, вместо объявления глобальной переменной в теле функции, передавайте эту переменную вторым параметром, и в вызове функции явно указывайте название таблицы, из которой вам нужно получить данные. Пример :
PHP:
скопировать код в буфер обмена
  1. function getproductsByIds($IdsArray, $GetPage) {
  2.    //global $GetPage; Эта строка больше не нужна
  3. }
3. Nizz - 31 Июля, 2017 - 17:51:17 - перейти к сообщению
Извините, наверное я не правильно выразил суть проблемы. Попробую уточнить: все дело в том, что у меня есть две таблицы с разными названиями: 1 и 2. Название столбцов идентичное, но значения в них разные. Это сессия покупательской тележки, кликая по кнопке, товар попадает в сессию с id. После чего я извлекаю данные о товаре исходя из id. Сначала человек видит товар из таблицы 1, но стоит ему добавить товар из таблицы 2, как и первый товар перезапишется со значениями из таблицы 2.
Можно ли в такой ситуации составить такой цикл?
4. Строитель - 31 Июля, 2017 - 18:03:49 - перейти к сообщению
Nizz, у вас функция getproductsByIds() возвращает массив данных, полученный из базы, верно?
Nizz пишет:
Сначала человек видит товар из таблицы 1, но стоит ему добавить товар из таблицы 2, как и первый товар перезапишется со значениями из таблицы 2.
Можно ли в такой ситуации составить такой цикл?
Т.е., вам нужно выводить пользователю (покупателю) все товары из его корзины, которые ранее были сохранены в базу?
5. Nizz - 31 Июля, 2017 - 20:32:12 - перейти к сообщению
У меня уже есть массив, с ключом которых является id товара, а значением массива является кол-во товара выбранного клиентом. У меня несколько таблиц с товаром, которые я решил разбить по категориям (теперь жалею, тк при объединении в одну таблицу придется переписать пол сайта). Сложность для меня в том, как в один цикл объединить подключение к разных таблицам. То-есть сначала человек выбрал товар с номером 7 из таблицы 1, а затем товар с номером 5 из таблицы 2. Но сейчас, при выборе товара из другой таблицы, все товары, выбранные до этого перепишутся в товары из последней.
Извините если сильно заморочил голову.

Функция описанная выше, просто подключается к Sql используя id товара в качестве индитификатора и выводит мне данные.
6. Строитель - 31 Июля, 2017 - 20:38:37 - перейти к сообщению
Nizz, я не уверен, но мне кажется, что тут надо смотреть не в сторону массивов, а в сторону sql-запросов с использованием объединения таблиц (JOIN).
7. Nizz - 31 Июля, 2017 - 22:17:50 - перейти к сообщению
можете дать наводку где об этом почитать ? если не сложно ?
8. Строитель - 31 Июля, 2017 - 23:02:38 - перейти к сообщению
Nizz,
Этот хитрый LEFT JOIN
простые примеры JOIN
9. MouseZver - 01 Августа, 2017 - 00:00:46 - перейти к сообщению
сейчас бы передавать наименование таблицы по гет параметру...
10. Nizz - 01 Августа, 2017 - 09:46:02 - перейти к сообщению
Строитель спасибо вам за наводку. Попробую реализовать правда у меня таблиц с товаром не две, а 9 и боюсь, что сильно будет грузить sql. Спасибо за то, что попытались помочь.
11. Nizz - 02 Августа, 2017 - 13:42:13 - перейти к сообщению
Дабы не засарять данный форум лишней темой, я с позволения форумчан взываю о помощи, над решением вопроса. Код, все тот же самый, но решение своей трудности вижу исключительно через новую таблицу в sql , тк ознакомившись с док. по Join, понял, что он меня не выручит. Не получается следующие:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT `id`, `name`, `articl`, `price` FROM $GetPage WHERE id IN ($idsString)";
  3.    $result = $db->query($sql);
  4.    $result->setFetchMode(PDO::FETCH_ASSOC);
  5.       $i = 0;
  6.    while ($row = $result->fetch()) {
  7.          $products[$i]['id'] = $row['id'];
  8.           $products[$i]['name'] = $row['name'];
  9.            $products[$i]['price'] = $row['price'];
  10.         $products[$i]['articl'] = $row['articl'];
  11.            $i++;
  12.        
  13.        BUY_Pri($row[id], $row[name], $row[price], $row[articl]);
  14.      
  15.        }
  16.  

Я хочу получить значения массива $row, что бы занести их в sql. Массив $row, видит только внутри цикла while. Как мне получить эти значения ? Выручайте товарищи.
12. Строитель - 02 Августа, 2017 - 21:32:19 - перейти к сообщению
Nizz, я так понимаю, что вам необходимо собрать массив для передачи его в пользовательскую функцию? Если да, то ваш код будет иметь следующий вид:
Спойлер (Отобразить)
А в функции обрабатывать этот массив (для примера, просто распечатаем массив в браузере):
Спойлер (Отобразить)
13. MouseZver - 03 Августа, 2017 - 09:17:03 - перейти к сообщению
сетфетчмод прописывает конфиги после подключения к бд, достаточно в fetch ( PDO::FETCH_ASSOC ) добавить
(Добавление)
можно вовсе воспользоваться константой PDO::FETCH_FUNC
http://phpfaq[dot]ru/pdo/fetch
(Добавление)
там можно найти очень много различных вкусняшек
14. Nizz - 03 Августа, 2017 - 11:23:34 - перейти к сообщению
Строитель спасибо вам за помощь, правда пришлось изменить $buyPri = []; на $buyPri = ''; тк. ругалось на синтаксическую ошибку.
PHP:
скопировать код в буфер обмена
  1.  
  2. $result->setFetchMode(PDO::FETCH_ASSOC);
  3.  
  4. $i = 0;
  5. $buyPri = [];
  6.  


Знаю, что вам уже безумно надоел но проблема все-таки не могу понять как отдельные переменные из массива засунуть в таблицу: $row['id'], $row['name'] и другие.
PHP:
скопировать код в буфер обмена
  1.  
  2. function getPdoConnectUser ($userId, $productName, $productId, $productPrice, $productArticl){
  3.    $db = Db::getPDOconnect();
  4.     $sql = 'INSERT INTO buy_price (user_id, product_name, product_id, product_price, product_articl)'. 'VALUES (:user_id, :user_name, :user_phone, :user_comment, :products) ';
  5.     $result = $db->prepare($sql);
  6.     $result->bindParam(':user_id', $userId, PDO::PARAM_STR);
  7.     $result->bindParam(':product_name', $productName, PDO::PARAM_STR);
  8.     $result->bindParam(':product_id', $productId, PDO::PARAM_INT);
  9.     $result->bindParam(':product_price', $productPrice, PDO::PARAM_STR);
  10.     $result->bindParam(':product_articl', $productArticl, PDO::PARAM_STR);
  11. }
  12.  
  13.  

Помогите пожалуйста
15. ytrewq123 - 07 Августа, 2017 - 00:25:05 - перейти к сообщению
Здравствуйте!
Попробуйте так.
Во-первых выборка. Чтобы не формировать этот массив самому, пусть это делает MYSQ и PHP.

PHP:
скопировать код в буфер обмена
  1. $sql = "SELECT `id`, `name`, `articl`, `price` FROM $GetPage WHERE id IN ($idsString)";
  2. $result = $db->query($sql);
  3. $info = $result ->fetchAll(PDO::FETCH_NUM);


В $info будет массив массивов.
Если у вас один, то вообще просто.

PHP:
скопировать код в буфер обмена
  1. $zap = "INSERT INTO `buy_price ` (`name`, `articl`, `price`) VALUES (?,?,?)";
  2. $pod = $so->prepare($zap);
  3. $pod->execute($info[0]);
  4.  


если много, то придумал только так.

PHP:
скопировать код в буфер обмена
  1. $zap = "INSERT INTO `buy_price ` (`name`, `articl`, `price`) VALUES (?,?,?)";
  2. $pod = $so->prepare($zap);
  3. for($z=0;$z<count($info);$z++)
  4. {
  5.  $pod->execute($info[$z]);
  6. }
  7.  

 

Powered by ExBB FM 1.0 RC1