Почему WordPress wpdb->prepare меняет% на случайное руководствоPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему WordPress wpdb->prepare меняет% на случайное руководство

Сообщение Anonymous »

Это началось с того, что я пытался понять, как заставить что-то работать, и был сбит с толку полученным результатом. Когда я проверял, четко ли я написал этот вопрос, я наткнулся на ответ. Теперь возникает вопрос, ПОЧЕМУ он ведет себя таким образом, поскольку это меня очень сбивало с толку и заставило поверить, что проблема совершенно другая, чем она была на самом деле.

Мне нужно было это сделать. запросите пользовательскую таблицу в базе данных 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»