Это началось с того, что я пытался понять, как заставить что-то работать, и был сбит с толку полученным результатом. Когда я проверял, четко ли я написал этот вопрос, я наткнулся на ответ. Теперь возникает вопрос, ПОЧЕМУ он ведет себя таким образом, поскольку это меня очень сбивало с толку и заставило поверить, что проблема совершенно другая, чем она была на самом деле.
Мне нужно было это сделать. запросите пользовательскую таблицу в базе данных Wordpress, которую я создал. Мне нужно было несколько столбцов, а строк могло быть несколько, поэтому я использовал $wpdb->get_results. Однако я знаю, что очень важно предотвратить внедрение sql, поэтому настоятельно рекомендуется использовать его вместе с $wpdb->prepare. Во всех примерах, которые я видел, есть несколько способов, которые работают для других, например:
Код: Выделить всё
$wpdb->get_results($wpdb->prepare(
"SELECT * FROM %s WHERE ADDRESS LIKE %%%s%%", $tableName, $address
));
или
Код: Выделить всё
$wpdb->get_results($wpdb->prepare(
"SELECT * FROM %s WHERE ADDRESS LIKE %s", $tableName, '%' . $address . '%'
));
Однако во время разработки я использую переменную и выводю ее на экран в целях отладки, например:
Код: Выделить всё
$theQuery = $wpdb->prepare(
"SELECT * FROM %s WHERE ADDRESS LIKE %s", $tableName, '%' . $address . '%'
);
printf(nl2br("theQuery: " . $theQuery . PHP_EOL));
Когда я просматриваю результаты, я получаю следующее:
Код: Выделить всё
theQuery: SELECT * FROM 'wp_table' WHERE ADDRESS LIKE '{38f7caa660e456637b3924006588169e1912b28c0a81d0a4ae0d77885704a425}11th ST{38f7caa660e456637b3924006588169e1912b28c0a81d0a4ae0d77885704a425}'
Похоже, что оператор $wpdb->prepare приводит к тому, что % преобразуется в GUID какого-то типа. Каждый раз, когда я обновляю страницу, значения GUID изменяются, поэтому каждый раз генерируются новые GUID для символа %. Очевидно, это часть способа обеспечения безопасности от SQL-инъекций, но поскольку я не знал, что это будет вести себя таким образом, и никогда не видел этого в документации, я подумал, что это моя проблема. Я пробовал так много комбинаций, но всегда не получалось получить никаких результатов, и я всегда думал, что это из-за неправильного поведения с этими GUID. В итоге я обнаружил, что ДЕЙСТВИТЕЛЬНАЯ проблема заключалась в включении имени таблицы в качестве параметра в оператор подготовки. Это приводит к тому, что запрос заключает имя таблицы в одинарные кавычки, что приводит к синтаксической ошибке MySQL и не возвращает никаких результатов.
Почему именно он генерирует эти GUID и во время тестирования есть ли способ распечатать их в виде % в браузере для отладки?
Спасибо!
Подробнее здесь:
https://stackoverflow.com/questions/488 ... andom-guid