Переменные в запрос к базе

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 26 июня 2019 в 12:58
Доброго всем дня, уважаемые! Прошу помощи у знающих. Есть файл, лежит в корне сайта. В нём следующий код:
  1. <?php
  2.  
  3. $db = mysqli_connect("здесь то что нужно", "здесь то что нужно", "здесь то что нужно","здесь то что нужно");
  4.  
  5. printf("Не удалось подключиться: %s\n", mysqli_connect_error());
  6. exit();
  7. }
  8.  
  9. $result = mysqli_query($db,"SELECT table_name, column_name, data_type
  10. FROM information_schema.columns
  11. WHERE table_schema = 'здесь имя базы'
  12. AND data_type IN ('char', 'varchar', 'binary', 'varbinary','tinytext', 'text', 'mediumtext', 'longtext', 'tinyblob', 'blob', 'mediumblob', 'longblob')'");
  13.  
  14. while ($table_column = $result->fetch_assoc()) {
  15. $sql_news = mysqli_query($db,"SELECT * FROM ".$table_column["table_name"]." WHERE ".$table_column["column_name"]." LIKE '%000/u41/0/0/a9830fd1.jpg%'");
  16. if ($sql_news) {
  17. $count = mysqli_num_rows($sql_news);
  18. }
  19. if ($count > 0){
  20. echo 'Нашли совпадения '.$count.'';
  21. echo $table_column["table_name"].' '.$table_column["column_name"].' ';
  22. }
  23. }
  24. ?>
Код прекрасно отрабатывает и находит то, что нужно.
И есть функция

  1. public function search2($file){
  2.  
  3. $config = cmsConfig::getInstance();
  4. $db_host = $config->db_host;
  5. $db_base = $config->db_base;
  6. $db_user = $config->db_user;
  7. $db_pass = $config->db_pass;
  8.  
  9. $db = mysqli_connect($db_host, $db_user, $db_pass, $db_base);//подключаемся к базе
  10. if (mysqli_connect_errno()) { //проверяем соединение
  11. fwrite($fp, "Не удалось подключиться: ".mysqli_connect_error()." \r\n");
  12. exit();
  13. }
  14.  
  15. $result = mysqli_query($db,"SELECT table_name, column_name, data_type
  16. FROM information_schema.columns
  17. WHERE table_schema = '".$db_base."'
  18. AND data_type IN (
  19. 'char', 'varchar', 'binary', 'varbinary',
  20. 'tinytext', 'text', 'mediumtext', 'longtext',
  21. 'tinyblob', 'blob', 'mediumblob', 'longblob')");
  22.  
  23. while ($table_column = $result->fetch_assoc()) {
  24.  
  25. $sql_news = mysqli_query($db,"SELECT * FROM ".$table_column["table_name"]." WHERE ".$table_column["column_name"]." LIKE '%000/u41/0/0/a9830fd1.jpg%'");
  26. if ($sql_news) {
  27. $count = mysqli_num_rows($sql_news);
  28. }
  29. if ($count > 0){
  30. fwrite($fp, "Найден: "." \r\n");
  31. }else{
  32. fwrite($fp, "Не найден: "." \r\n");
  33. }
  34. }
  35. }
Функция не находит ничего в этой же базе. Проверил значения переменных. Вроде все передаются правильно. А вот если вместо запроса с переменными прописать вот так "SELECT * FROM cms_con_posts WHERE picture LIKE '%000/u41/0/0//a9830fd1.jpg%'", то находим то, что ищем. Пробовал вывести строку запроса, которая формируется с переменными — выдаёт точную копию строки "SELECT * FROM cms_con_posts WHERE picture LIKE '%000/u41/0/0//a9830fd1.jpg%'"
#2 26 июня 2019 в 16:16
@geminisf,
Попробуйте так:
  1. $sql_news = mysqli_query($db,"SELECT * FROM {$table_column['table_name']} WHERE {$table_column['column_name']} LIKE '%000/u41/0/0/a9830fd1.jpg%'");
#3 26 июня 2019 в 16:49
Ris, спасибо, но не помогло. Присвоил переменным имена таблиц и колонок, и пробую использовать в строке запроса именно эти переменные. И если их заключать в скобки и если по старому. Ничего не понимаю. Всю голову сломал. Пробовал в $table_column["table_name"] и $table_column["column_name"] двойные кавычки менять на одинарные. Не помогает.
#4 26 июня 2019 в 17:05
@geminisf,
Так посмотрите, прилетает ли что-нибудь в $table_column
  1. print_r($table_column);
#5 26 июня 2019 в 19:25
Ris, конечно прилетает. Строка запроса формируется. Сейчас строки формирования запроса выглядят вот так:
  1.  
  2. $table_name = $table_column["table_name"];
  3. $column_name = $table_column["column_name"];
  4.  
  5. fwrite($fp, "SELECT * FROM {$table_name} WHERE {$column_name} LIKE '%000/u41/0/0/a9830fd1.jpg%'"." \r\n");
  6.  
  7. $sql_news = mysqli_query($db,"SELECT * FROM {$table_name} WHERE {$column_name} LIKE '%000/u41/0/0/a9830fd1.jpg%'");
Вывод в файл даёт следующее:
  1.  
  2. SELECT * FROM cms_activity WHERE subject_title LIKE '%000/u41/0/0/a9830fd1.jpg%'
  3. SELECT * FROM cms_activity WHERE subject_url LIKE '%000/u41/0/0/a9830fd1.jpg%'
  4. SELECT * FROM cms_activity WHERE reply_url LIKE '%000/u41/0/0/a9830fd1.jpg%'
  5. SELECT * FROM cms_activity WHERE images LIKE '%000/u41/0/0/a9830fd1.jpg%'
  6. SELECT * FROM cms_activity_types WHERE controller LIKE '%000/u41/0/0/a9830fd1.jpg%'
  7. SELECT * FROM cms_activity_types WHERE name LIKE '%000/u41/0/0/a9830fd1.jpg%'
  8. SELECT * FROM cms_activity_types WHERE title LIKE '%000/u41/0/0/a9830fd1.jpg%'
  9. SELECT * FROM cms_activity_types WHERE description LIKE '%000/u41/0/0/a9830fd1.jpg%'
  10. SELECT * FROM cms_bots_actions WHERE title LIKE '%000/u41/0/0/a9830fd1.jpg%'
  11. SELECT * FROM cms_bots_actions WHERE bots_ids LIKE '%000/u41/0/0/a9830fd1.jpg%'
  12. SELECT * FROM cms_bots_actions WHERE options LIKE '%000/u41/0/0/a9830fd1.jpg%'
  13. SELECT * FROM cms_bots_actions WHERE content LIKE '%000/u41/0/0/a9830fd1.jpg%'
  14. SELECT * FROM cms_bots_actions_contents WHERE content LIKE '%000/u41/0/0/a9830fd1.jpg%'
  15. SELECT * FROM cms_bots_actions_types WHERE title LIKE '%000/u41/0/0/a9830fd1.jpg%'
  16. SELECT * FROM cms_bots_actions_types WHERE name LIKE '%000/u41/0/0/a9830fd1.jpg%'
  17. SELECT * FROM cms_bots_logs WHERE content LIKE '%000/u41/0/0/a9830fd1.jpg%'
  18. SELECT * FROM cms_bots_synonyms WHERE synonyms LIKE '%000/u41/0/0/a9830fd1.jpg%'
  19. SELECT * FROM cms_comments WHERE target_controller LIKE '%000/u41/0/0/a9830fd1.jpg%'
  20. SELECT * FROM cms_comments WHERE target_subject LIKE '%000/u41/0/0/a9830fd1.jpg%'
  21. SELECT * FROM cms_comments WHERE target_url LIKE '%000/u41/0/0/a9830fd1.jpg%'
  22. SELECT * FROM cms_comments WHERE target_title LIKE '%000/u41/0/0/a9830fd1.jpg%'
  23. SELECT * FROM cms_comments WHERE author_name LIKE '%000/u41/0/0/a9830fd1.jpg%'
  24. SELECT * FROM cms_comments WHERE author_email LIKE '%000/u41/0/0/a9830fd1.jpg%'
  25.  
  26.  
ну и т.д. по всем таблицам и колонкам формируется подобная строка запроса
#6 27 июня 2019 в 08:30
Как выяснилось не работает почему-то вот эта конструкция:
  1.  
  2. if ($sql_news) {
  3. $count = mysqli_num_rows($sql_news);
  4. }
Запрос проходит нормально и находит то, что нужно, судя по тому, что находится в $sql_news. Вот фрагмент, где видно что запрос нашел, то что нужно:
  1.  
  2. mysqli_result Object
  3. (
  4. [current_field] => 0
  5. [field_count] => 33
  6. [lengths] =>
  7. [num_rows] => 0
  8. [type] => 0
  9. )
  10. mysqli_result Object
  11. (
  12. [current_field] => 0
  13. [field_count] => 33
  14. [lengths] =>
  15. [num_rows] => 1
  16. [type] => 0
  17. )
  18. mysqli_result Object
  19. (
  20. [current_field] => 0
  21. [field_count] => 33
  22. [lengths] =>
  23. [num_rows] => 0
  24. [type] => 0
  25. )
  26.  
[num_rows] => 1 как раз говорит о том, что мы нашли то, что искали.
#7 27 июня 2019 в 09:01
Проблема решена. Окончательный вариант функции:
  1.  
  2. public function search2($file){
  3.  
  4. $config = cmsConfig::getInstance();
  5. $db_host = $config->db_host;
  6. $db_base = $config->db_base;
  7. $db_user = $config->db_user;
  8. $db_pass = $config->db_pass;
  9.  
  10. $fp = fopen('upload/delete_files_log.txt', 'a+t');
  11.  
  12. $db = mysqli_connect($db_host, $db_user, $db_pass, $db_base);//подключаемся к базе
  13. fwrite($fp, "Не удалось подключиться: ".mysqli_connect_error()." \r\n");
  14. exit();
  15. }
  16.  
  17.  
  18. $result = mysqli_query($db,"SELECT table_name, column_name, data_type
  19. FROM information_schema.columns
  20. WHERE table_schema = '".$db_base."'
  21. AND data_type IN (
  22. 'char', 'varchar', 'binary', 'varbinary',
  23. 'tinytext', 'text', 'mediumtext', 'longtext',
  24. 'tinyblob', 'blob', 'mediumblob', 'longblob')");
  25. $res_search = 'no';
  26. while ($table_column = $result->fetch_assoc()) {
  27. $table_name = $table_column["table_name"];
  28. $column_name = $table_column["column_name"];
  29. $sql_news = mysqli_query($db,"SELECT * FROM {$table_name} WHERE {$column_name} LIKE '%{$file}%'");
  30. if ($sql_news) {
  31. $count = mysqli_num_rows($sql_news);
  32. if ($count > 0){
  33. $res_search = 'yes';
  34. }
  35. mysqli_free_result($sql_news);
  36. }
  37. }
  38. return $res_search;
  39. }
  40.  
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.