WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Обращение к 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 переменные. Как я могу это сделать? И могу ли вообще?

0
shamil
5.3 года назад 21
  • 0
    Kama9602

    Да, без проблем. $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' ]; // тут валидацию сделай!

    Про безопасность не забывай, делай валидацию получаемых данных!

    shamil 5.3 года назад

    Понял, спасибо большое)

    shamil 5.3 года назад

    Твой совет оказался действительно логичнее, но столкнулся с одной проблемой:

    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 (Internal Server Error)
    Response error: Internal Server Error

    Kama 5.3 года назад

    По коду не вижу ошибки, надо дебажить так не подскажу. Ваще ппц странно... 500 ошибка еще, похоже на сервере что-то, а не в PHP, темболее если первый раз отрабатывает: памяти не хватает, время выполнения заканчивается, странно... Включи WP_DEBUG в консоли должен увидеть текст ошибки, если не увидишь, смотри в логах. Загляни в статью о дебаге.

    Ты совсем о безопасности не думаешь, это же инъекция SQL делай не хочу. Запрос так переделай:

    $result = $wpdb->get_results( $wpdb->prepare(
    	"SELECT id, post_id, author, filename FROM wp_photos WHERE album_id = %d", $id
    ) );
    shamil 5.3 года назад

    Вот что выдал лог:

    [27-Nov-2018 19:26:15 UTC] PHP Fatal error: Cannot redeclare del_photo_in_path() (previously declared in /home/p319312/www/xxxxx.ru/wp-content/themes/yoo_finch/functions.php:597) in /home/p319312/www/xxxxx.ru/wp-content/themes/yoo_finch/functions.php on line 597

    Я правильно понимаю, что он ругается на то, что повторно объявляется функция del_photo_in_path()?
    Она у меня внутри функции delete_photo(). Как и где тогда её лучше объявлять? Выносить её из этой функции?

    P.S. Про безопасность я понимаю, просто сейчас все силы бросаю на выполнение основного функционала, потом пройдусь по всем запросам к БД и проверкам)

    Kama 5.3 года назад

    А, ну да логично, повторный вызов функции повторно пытается объявить функцию 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);
    	}

    Про безопасность я понимаю, просто сейчас...

    Лучше это сразу делать, хотя бы базовые вещи!

    shamil 5.2 года назад

    Понял. Буду придерживаться. Спасибо за помощь)

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация