Для умных: воспользоваться отладчиком, и посмотреть по шагам что происходит в вашем коде.
Для усердных: добавить во все if'ы вывод echo с каким-то текстом, как-то так:
if($_FILES['img']['error'] == 0){
echo "img error = 0\n";
echo "tmp path = {$_FILES['img']['tmp_name']}\n";
echo "new path = $full_path\n";
if(move_uploaded_file($_FILES['img']['tmp_name'], $full_path)){
$this->CertificatesNew->query("INSERT INTO certificates_new(title, img) VALUES ('$title', '$new_name');");
} else {
echo "move_uploaded_file error";
}
} else {
echo "img error = " . $_FILES['img']['error'];
}
Может там прав на запись нет, или еще какая беда. Некоторым людям проще написать тучу строчек с этими echo чем запустить отладчик.
И да, вам следовало бы предусмотреть что с клиента вам могуть прислать файл без расширения или с двойным расширением "котик.jpg.rar" а внутри файла при этом будет php код, например. И mime type могут подменить на что угодно.
Хорошей практикой является проверка не по расширению а по самому файлу. Вызовом getimagesize() или exif_imagetype().