Обращение к PHP-функции AJAX Symply без AJAX
Использую AJAX Simply для удаления фотографий. Всё работает отлично.
Но мне понадобилось обратиться к этой функции не через AJAX, а через другую функцию PHP. И тут мне не совсем понятно, как в функцию передать переменные.
Начало функции удаления фотографии:
function ajaxs_delete_photo( $jx ){
$post_id = $jx->post_id;
$photo_id = $jx->photo_id;
$filename = $jx->filename;
$user_id = $jx->user_id;
А вот кусок кода, в котором я хочу обратиться к функции ajaxs_delete_photo( $jx )
$result = $wpdb->get_results("SELECT id, post_id, author, filename FROM wp_photos WHERE album_id = $id");
foreach ($result as $row)
{
$photos[] = array(
'post_id' => $row->post_id,
'photo_id' => $row->id,
'user_id' => $row->author,
'filename' => $row->filename);
}
foreach ($photos as $photo)
{
ajaxs_delete_photo( $photo );
}
Мне нужно передать 4 переменные. Как я могу это сделать? И могу ли вообще?
Да, без проблем. $jx это объект, а ты передаешь массив, за это и зацепись. Т.е. надо сделать проверку и сконвертировать массив в объект:
function ajaxs_delete_photo( $jx ){ // для обращения к функции из PHP (в $jx тут нужно передать массив) if( is_array($jx) ) $jx = (object) $jx; $post_id = $jx->post_id; $photo_id = $jx->photo_id; $filename = $jx->filename; $user_id = $jx->user_id;-
Но вообще логичнее (потом для расширения кода может пригодится), переделать свою функцию удаления на обычную функцию и для ajaxs просто сделать обертку для нее. Получится так:
function ajaxs_delete_photo( $jx ){ // можно записать коротко my_delete_photo( $jx->data ); // или так, чтобы код был понятнее my_delete_photo( array( 'post_id' => $jx->post_id, 'photo_id' => $jx->photo_id, 'filename' => $jx->filename, 'user_id' => $jx->user_id, ) ); } function my_delete_photo( $args ){ $post_id = (int) $args[ 'post_id' ]; $photo_id = (int) $args[ 'photo_id' ]; $user_id = (int) $args[ 'user_id' ]; $filename = $args[ 'filename' ]; // тут валидацию сделай!Про безопасность не забывай, делай валидацию получаемых данных!
Понял, спасибо большое)
Твой совет оказался действительно логичнее, но столкнулся с одной проблемой:
function ajaxs_del_album ( $jx ) { $id = $jx->id; global $wpdb; $result = $wpdb->get_results("SELECT id, post_id, author, filename FROM wp_photos WHERE album_id = $id");// получаю данные на 5 фотографий foreach ($result as $row) { $photos[] = array( 'post_id' => $row->post_id, 'photo_id' => $row->id, 'user_id' => $row->author, 'filename' => $row->filename); } foreach ($photos as $photo) { delete_photo( $photo );// полностью удаляется только первая фотография, вторая удаляется только из БД, а остальные остаются нетронутыми } $jx->reload( $delay = 0 );// перезагрузка страницы уже не происходит }а вот сама функция удаления фото:
function delete_photo( $photo ){ $post_id = (int) $photo[ 'post_id' ]; $photo_id = (int) $photo[ 'photo_id' ]; $user_id = (int) $photo[ 'user_id' ]; $filename = $photo[ 'filename' ]; global $wpdb; $wpdb->delete( 'wp_posts', array( 'id' => $post_id ) ); // Удаление из таблицы wp_posts $wpdb->delete( 'wp_photos', array( 'id' => $photo_id ) ); // Удаление из таблицы wp_photos $wpdb->delete( 'wp_links_slide_photo', array( 'id_photo' => $post_id ) ); // Удаление связи со слайдом $wpdb->delete( 'wp_links_post_photo', array( 'id_photo' => $post_id ) ); // Удаление связи с текстом $wpdb->delete( 'wp_like', array( 'id_photo' => $post_id ) ); // Удаление лайков $user_dir = $_SERVER["DOCUMENT_ROOT"] . '/uploads/users/' . $user_id; $user_dir_photo = $user_dir . '/photo/'; $user_dir_photo_1280 = $user_dir_photo . '1280/'; $user_dir_photo_640 = $user_dir_photo . '640/'; $user_dir_photo_320 = $user_dir_photo . '320/'; $user_dir_photo_160 = $user_dir_photo . '160/'; function del_photo_in_path ($path, $filename) { if (file_exists($path . $filename)) { unlink($path . $filename); } } del_photo_in_path ($user_dir_photo, $filename); del_photo_in_path ($user_dir_photo_1280, $filename); del_photo_in_path ($user_dir_photo_640, $filename); del_photo_in_path ($user_dir_photo_320, $filename); del_photo_in_path ($user_dir_photo_160, $filename); }в цикле forech при обращении к функции delete_photo () происходит какой-то обрыв или что-то типа того, потому что вторую фотографию он уже не удаляет и дальше код не срабатывает. а в консоли мне выдается следующее:
По коду не вижу ошибки, надо дебажить так не подскажу. Ваще ппц странно... 500 ошибка еще, похоже на сервере что-то, а не в PHP, темболее если первый раз отрабатывает: памяти не хватает, время выполнения заканчивается, странно... Включи WP_DEBUG в консоли должен увидеть текст ошибки, если не увидишь, смотри в логах. Загляни в статью о дебаге.
Ты совсем о безопасности не думаешь, это же инъекция SQL делай не хочу. Запрос так переделай:
Вот что выдал лог:
Я правильно понимаю, что он ругается на то, что повторно объявляется функция del_photo_in_path()?
Она у меня внутри функции delete_photo(). Как и где тогда её лучше объявлять? Выносить её из этой функции?
P.S. Про безопасность я понимаю, просто сейчас все силы бросаю на выполнение основного функционала, потом пройдусь по всем запросам к БД и проверкам)
А, ну да логично, повторный вызов функции повторно пытается объявить функцию del_photo_in_path() а она уже есть, вот и ошибка!
Запиши лучше нормально, замени:
$user_dir_photo = $user_dir . '/photo/'; $user_dir_photo_1280 = $user_dir_photo . '1280/'; $user_dir_photo_640 = $user_dir_photo . '640/'; $user_dir_photo_320 = $user_dir_photo . '320/'; $user_dir_photo_160 = $user_dir_photo . '160/'; function del_photo_in_path ($path, $filename) { if (file_exists($path . $filename)) { unlink($path . $filename); } } del_photo_in_path ($user_dir_photo, $filename); del_photo_in_path ($user_dir_photo_1280, $filename); del_photo_in_path ($user_dir_photo_640, $filename); del_photo_in_path ($user_dir_photo_320, $filename); del_photo_in_path ($user_dir_photo_160, $filename);На это:
$user_dir_photo = $user_dir . '/photo/'; $files = [ $user_dir_photo . $filename, $user_dir_photo . '1280/' . $filename, $user_dir_photo . '640/' . $filename, $user_dir_photo . '320/' . $filename, $user_dir_photo . '160/' . $filename, ]; foreach( $files as $file ){ if ( file_exists($file) ) unlink($file); }Лучше это сразу делать, хотя бы базовые вещи!
Понял. Буду придерживаться. Спасибо за помощь)