За последние 24 часа нас посетили 22720 программистов и 1183 робота. Сейчас ищут 803 программиста ...

Функция genSlots() RedBeanPHP. Помогите найти ошибку в запросе

Тема в разделе "PHP и базы данных", создана пользователем Иван Сила, 11 фев 2021.

Метки:
  1. Иван Сила

    Иван Сила Новичок

    С нами с:
    1 фев 2021
    Сообщения:
    11
    Симпатии:
    0
    Всем доброго дня.
    Столкнулся с проблемой в запросе.
    Делаю запрос, выдает ошибку.
    Подскажите где ошибся? Понимаю что истина где то рядом, но найти не могу
    Вот кусок кода:
    <code>
    $arr1 = [$poid, $pid, $opid1, 67, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    $arr2 = [$poid, $pid, $opid1, 66, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    $arr3 = [$poid, $pid, $opid1, 65, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    $arr4 = [$poid, $pid, $opid1, 65, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    $arr5 = [$poid, $pid, $opid1, 63, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    $arr6 = [$poid, $pid, $opid1, 69, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    $arr7 = [$poid, $pid, $opid1, 68, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];

    R::exec(
    'INSERT INTO oc_product_option_value (product_option_id, product_id, option_id, option_value_id, quantity, subtract, price, price_prefix, points, points_prefix, weight, weight_prefix, default_status) VALUES
    (' . R::genSlots($arr1) . '),
    (' . R::genSlots($arr2) . '),
    (' . R::genSlots($arr3) . '),
    (' . R::genSlots($arr4) . '),
    (' . R::genSlots($arr5) . '),
    (' . R::genSlots($arr6) . '),
    (' . R::genSlots($arr7) . ')',
    [$arr1, $arr2, $arr3, $arr4, $arr5, $arr6, $arr7]

    );
    </code>

    И вот ошибка:
    Fatal error: Uncaught [HY093] - SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens trace: #0 C:\xampp2\htdocs\red\rb.php(1253): RedBeanPHP\Driver\RPDO->runQuery('INSERT INTO oc_...', Array) #1 C:\xampp2\htdocs\red\rb.php(4285): RedBeanPHP\Driver\RPDO->Execute('INSERT INTO oc_...', Array) #2 C:\xampp2\htdocs\red\rb.php(12830): RedBeanPHP\Adapter\DBAdapter->exec('INSERT INTO oc_...', Array) #3 C:\xampp2\htdocs\red\rb.php(13877): RedBeanPHP\Facade::query('exec', 'INSERT INTO oc_...', Array) #4 C:\xampp2\htdocs\red\option.php(131): RedBeanPHP\Facade::exec('INSERT INTO oc_...', Array) #5 {main} thrown in C:\xampp2\htdocs\red\rb.php on line 834



    Буду очень признателен за помощь. Спасибо
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    зачем тебе 13 колонок на 7 значений ? ты правильно используешь запрос ?
     
  3. Иван Сила

    Иван Сила Новичок

    С нами с:
    1 фев 2021
    Сообщения:
    11
    Симпатии:
    0
    Если бы правильно использовал, то запрос бы выполнился
    А так ошибки
    Понимаю что не правильно, поэтому и обратился к знатокам, чтобы подсказали где что поправить - чтобы было правильно
    Если знаешь - подскажи
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    С помощью echo выведите ваш запрос на страницу.
    Методом copy\paste перенесите его в phpmyadmin, и выполните его там.
    И всё сразу прояснится.
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Иван Сила, ещё раз обрати внимание на #2.
    13 названий колонок в запросе и лишь 7 значений для них.
     
  6. Иван Сила

    Иван Сила Новичок

    С нами с:
    1 фев 2021
    Сообщения:
    11
    Симпатии:
    0
    я правильно понимаю, вы предлагаете мне вывести вот это:

    R::exec(
    'INSERT INTO oc_product_option_value (product_option_id, product_id, option_id, option_value_id, quantity, subtract, price, price_prefix, points, points_prefix, weight, weight_prefix, default_status) VALUES
    (' . R::genSlots($arr1) . '),
    (' . R::genSlots($arr2) . '),
    (' . R::genSlots($arr3) . '),
    (' . R::genSlots($arr4) . '),
    (' . R::genSlots($arr5) . '),
    (' . R::genSlots($arr6) . '),
    (' . R::genSlots($arr7) . ')',
    [$arr1, $arr2, $arr3, $arr4, $arr5, $arr6, $arr7]

    );
    или я чего не понимаю как надо сделать.....
    --- Добавлено ---
    Метод genSlots() должен распарсить в 13 значений, то что я в массив положил
    Понимаю что там ошибка - знаний не хватает чтобы понять какие значения в массиве лишние для запроса
    --- Добавлено ---
    7 строк, - 7 массивов , в каждом массиве 13 значений
    я так посчитал что правильно
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Да. Всё, что внутри R::exec();
    Вместо вывода на страницу, можно записать его в текстовый файл.
     
    #7 Drunkenmunky, 11 фев 2021
    Последнее редактирование: 11 фев 2021
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    переведи?
    что такое genSlots ? что она делает?
     
  9. Иван Сила

    Иван Сила Новичок

    С нами с:
    1 фев 2021
    Сообщения:
    11
    Симпатии:
    0
    7 строк
    подставляет из массива в подготовленный запрос значения
    --- Добавлено ---
    вот тут она
    https://redbeanphp.com/index.php?p=/finding
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    просто выведи для начала
    PHP:
    1. echo R::genSlots($arr1);
     
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Да, не на тот момент внимание обратил :)
    В запросе подставляется 7*13 знаков вопросов.
    Для каждого из них должно быть соответствующее значение в массиве "привязанных элементов".
    Вы же передаёте двумерный массив.
    Надо объединить эти 7 массивов в один и результат использовать в качестве параметра (не обрамляя его дополнительно скобками квадратными).
     
  12. Иван Сила

    Иван Сила Новичок

    С нами с:
    1 фев 2021
    Сообщения:
    11
    Симпатии:
    0
    gj
    Понимаю ход ваших мыслей, но
    в самом запросе в каждой строке вызывается функция со своим значением типа того:
    (' . R::genSlots($arr4) . ')

    Не могу сообразить, как тут поступить.
    Ведь если 7 массивов объединить в 1 , а саму функцию вызывать 7 раз - ерунда получится
    Или не так?
    --- Добавлено ---
    Вывел. Как и ожидалось - вот такая строка выводится в браузере : ?,?,?,?,?,?,?,?,?,?,?,?,?
    То же количество параметров
    13 штук, как и здесь: $arr1 = [$poid, $pid, $opid1, 67, '100.00', 0, '0.0000', '+', 0, '+', '0.00000000', '+', 0];
    пока не понимаю куда двигаться дальше, где копать
    но, будем искать
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Иван Сила, на каждый знак ? должен быть один элемент массива связываемых значений.
    Ошибка ведь такова: "number of bound variables does not match number of tokens"
    --- Добавлено ---
    Этот "элемент массива" может быть массивом только в случае, если дополнительно указывается тип (строка, целое число...) связываемого значения