|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
В PHP есть функция mysqli_stmt_bind_param , которой в аргументах передаются значения параметров запроса. Я не знаю заранее число параметров. Документация рекомендует использовать функцию call_user_func_array. Но в комментариях рекомендуют использовать рефлекцию и вызывать invokeArgs. Как будет лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2019, 17:05 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Документация не рекомендует call_user_func_array, а только предостерегает использование. Слишком мало информации для ответа на вопрос. Нужно выложить исходник или задачу, которую нужно выполнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 22:46 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Задача простая — сделать обертку для mysqli_stmt_bind_param, которая бы принимала строку с SQL-запросом и массивом параметров и возвращала подготовленный запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 00:05 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Слишком абстрактная задача. Нужно конкретней. Я почему-то уверен, что здесь не нужно заморачиваться колбэком ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 15:11 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Мне нужна функция-обертка: dbquery($sql, $params=[]) Она принимает SQL-запрос. В SQL-запросе могут быть заданы переменные (параметры), в этом случае она должна их задать при выполнении запроса. После чего функция должна вернуть результат (например в ассоциированном массиве). В mysqli параметры задаются вызовом mysqli_stmt_bind_param, в который сразу передаются все параметры запроса. Если их количество мне неизвестно, нужно либо использовать многострочный switch вида: Код: php 1. 2. 3. 4. 5. 6.
либо call_user_func_array. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 15:20 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Либо переходить на PDO. Там параметры по одному биндятся и не составит проблем сделать цикл. Хотя, конечно, можно и на mysqli лисапед сочинить. Необходимую строчку кода с mysqli_stmt_bind_param собрать как текст, а потом ее выполнить при помощи eval(). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 15:51 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Помоему cufa лучше, чем eval. PDO у меня есть, но с этой прослойкой были какие-то неудобства. Поэтому сейчас я хочу сделать более прямую обертку для mysqli и oci8. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 16:21 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
vkle, дык проще сразу скуль делать сборку строк, чем коду в коде )) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 16:26 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Alibek B., авторлибо call_user_func_array. тогда уж сразу с ReflectionClass, ибо авторthis saves you about 20-40% Speed. Головняк побольше, но только на первый взгляд. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 16:42 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Честно говоря, меня удивило написанное, что ReflectionClass быстрее. Разве рефлекция по определению не медленная (поскольку нужно обрабатывать кучу метаинформации)? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 17:07 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Не знаю, но походу стОит доверять количеству голосов за комент. Бенчмарков никто пока не проводил, стань первым ) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 17:11 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Я не проверял, только предполагаю. Если использовать ReflectionClass, то задача даже упрощается, потому что это будет выглядеть примерно так Пример из комента Код: php 1. 2. 3. 4. 5. 6. 7.
Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Вот и не надо никаких ссылок ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2019, 17:56 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Что-то не запутался со ссылками. Не подскажите, как должно быть правильно? Есть такой тестовый код, предполагающий наличие базы данных db, содержащей таблицу TMP(ID,C1,C2): Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
По идее, в таблицу должна добавиться строка со значениями (1,2). Однако добавляется строка со значениями (123,123) и отладочный вывод таков: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Почему $param принимает не те ссылки? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 19:09 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Кстати, если делать bind_param на каждой итерации, то работает: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Но в документации прямо указывается, что bind_param нужно делать только один раз, а execute() будет использовать те значения, которые заданы в привязанных переменных на момент вызова этого метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 19:25 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Нет. В документации сказано, что bind_param использует ссылки при прямом использовании функции. А в данном коде используется колбэк, который выполняет привязку ссылок на переменную $tmp. Если в дальнейшем менять $tmp, то и значения будут меняться. Пых не делает связь между байндом и колбэком, это ошибочное мнение. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 20:10 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
https://www.php.net/manual/ru/mysqli-stmt.execute.php Пример #1 Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 20:25 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
TolikDПых не делает связь между байндом и колбэком, это ошибочное мнение. Я вызываю bind_param и передаю в него набор ссылок &$param[i]. Я это понимаю так, что при вызове execute в запрос будут переданы значения, которые заданы по ссылке, указанной в массиве $param. И если я меняю значения в массиве $param, то адреса элементов $param[i] не меняются, но заданные в них ссылки на значения меняются — и в execute должны передаваться новые значения. Не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 20:30 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Код: php 1.
Код: php 1.
Вот и всё! О какой привязке $val идет речь? Чтоб работало, нужно именно так: Код: php 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 20:31 |
|
PHP: переменное число аргументов передать в массиве
|
|||
---|---|---|---|
#18+
Байнд и колбэк, повторяюсь, это совершенно разные функции. Может выспаться надо? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2019, 20:34 |
|
|
start [/forum/topic.php?fid=23&msg=39875362&tid=1459839]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 386ms |
0 / 0 |