mikropiks adlı üyeden alıntı: mesajı görüntüle
Evet bahsettiğiniz gibi önce mail gönderilip sonrasında kayıt işlemi gerçekleştiriliyor. Kayıt işlemi esnasında herhangi bir hatada id atlama veya kayıt yapılamama durumunda son_id+1 kısmı muhtemelen boşa düşecektir.

Sorunu düzeltmek için ilk olarak duyuru kaydı yapılmalı ve başarılı işlem sonrası son id değeri alınarak mail gönderilmeli. Mevcut koşullarda satır 144-155 te bulunan kod bloğunu last id çektiğiniz alanın üstüne çekmeniz gerekmekte. Bu insert işlemi üst kısımlardan veri beklendiği için aynı zamanda satır 40-51 bulunan kod bloğunuda insert işleminin üzerine çekmeniz gerekmekte.

İdeal İşlem Sıralaması
  • Login-Güvenlik Kontrolü
  • Kategori ID-Name Verisi
  • Duyuru Ekleme (Ekleme hatası olması durumunda işlemi durdurma)
  • Son Duyuru ID değeri Okulum
  • Mail Gonderme
Anladım,
Şu şekilde kodlarımı güncelledim fakat bu seferde duyuru veritabanına INSERT edemiyorum.
error.log dosyasında şu şekilde bir hata görüntülüyorum.

[php:error] [pid 654048] [client 100.100.100.3:50864] PHP Fatal error:  Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, null given in /var/www/duyuru/islemler/duyuru_ekle_islem.php:35\nStack trace:\n#0 /var/www/duyuru/islemler/duyuru_ekle_islem.php(35): mysqli_num_rows()\n#1 {main}\n  thrown in /var/www/duyuru/islemler/duyuru_ekle_islem.php on line 35, referer: https://cloud.*****.com.tr/duyuru/islemler/duyuru_duzenle.php
<?php
require_once('config.php');

// Initialize the session
session_start();

//print_r($_SESSION);
//yetki kontrolü yap
if($_SESSION['duyuru_yetki'] != "1"){
  header('Location: ../login.php');
  session_destroy();
}

//bugünki tarih
$currentDate = date('Y-m-d');
// Check if the user is logged in, otherwise redirect to login page
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: ../login.php");
    exit;
}

$user_id = $_SESSION['id'];

ini_set('display_errors', 1); // Hata mesajlarını görüntülemeyi aktif hale getirin
error_reporting(E_ALL); // Tüm hata seviyelerini görüntüle

$title = trim($_POST['title']);
$body = trim($_POST['body']);
$category_id = trim($_POST['category_id']);
$created_user = $user_id; // Kullanıcının id'sini al

$query = "SELECT * FROM categories WHERE id = $category_id";
$result2 = mysqli_query($conn, $query);

if (mysqli_num_rows($result) > 0) {
  $row2 = mysqli_fetch_assoc($result2);
  $category_name = $row2['name'];
}

// Verileri veritabanına ekleyen SQL sorgusunu oluşturun
$sql = "INSERT INTO announcements (title, body, category_id, created_user) VALUES ('$title', '$body', '$category_id', '$user_id')";

// SQL sorgusunu çalıştırın
if (mysqli_query($conn, $sql)) {
  // Sorgu başarıyla çalıştırıldıysa, post eklendi
  $json['post']['status'] = true;
  $json['post']['msg'] = 'Post eklendi';
} else {
  // Sorgu çalıştırılamadıysa, hata mesajını yazdırın
  $json['post']['msg'] = 'Post eklenemedi: ' . mysqli_error($conn);
}

$sql = "SELECT id FROM announcements ORDER BY id DESC LIMIT 1";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
$last_id = $row['id'];


// Formdan gönderilen verileri alın
/*$title = mysqli_real_escape_string($conn, $_POST['title']);
$body = mysqli_real_escape_string($conn, $_POST['body']);
$category_id = mysqli_real_escape_string($conn, $_POST['category_id']);
*/

$ozet = '
<html>
<!--[if mso]>
<style>
  body,table tr,table td,a, span,table.MsoNormalTable {  font-family:Arial, Helvetica, sans-serif !important; }
</style>
<!--<![endif]-->
  <center><img style="text-align: center;" src="https://cloud.*****.com.tr/duyuru/assets/img/*****-logo-mail.png"></center>
  <center><table>
    <td valign="middle" align="center" style="width: 400px; padding-top: 20px;">
      <h2 style="font-family: Arial;">['. $row2['name'] .'] '. $title .'</h2>
    </td>
    <td></td>
  </table></center>
  <center><table>
    <td valign="middle" align="center" style="padding-top:20px; width: 400px;">
      <p style="font-family: Arial;">'. $body .'</p>
    </td>
  </table></center>
  <center><table style="padding-top:20px; font-family: Arial; font-size:10px;">
    <td valign="middle" align="center" style="width: 400px; font-family: Arial; font-size:10px;">
      <a href="https://cloud.*****.com.tr/duyuru/duyuru_oku.php?id='. $last_id .'" style="color:#000000;">Bu yazı Outlook üzerinde düzgün görüntülenmiyor ise buraya tıklayarak Web üzerinden okuyabilirsiniz.</a>
    </td>
  </table></center>
  <center><table style="font-family: Arial; font-size:10px;">
    <td valign="middle" align="center" style="width: 400px; font-family: Arial; font-size:10px;">
      <p>**Resimlerin tam boyutlu haline ulaşmak için üzerine tıklayabilirsiniz.</p>
    </td>
  </table></center>
</html>
';

// Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
 
// Include PHPMailer library files
require 'src/Exception.php';
require 'src/PHPMailer.php';
require 'src/SMTP.php';
//require 'index.php';

// Create an instance of PHPMailer class
$mail = new PHPMailer;

// UTF-8
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';

// SMTP configuration
//$mail->IsSMTP();          //Çalışmazsa etkinleştir.
$mail->Host     = 'email.*****.com.tr';
$mail->SMTPAuth = true;
$mail->Username = 'enesis@*****.com.tr';
$mail->Password = '****';
$mail->SMTPSecure = 'tls';
$mail->Port     = 587;

// Sender info
$mail->setFrom('enesis@*****.com.tr', '***** Duyuru Sistemi');
 
// Add a recipient
$mail->addAddress('tsonkaya@*****.com.tr');
//$mail->addAddress('skaraca@*****.com.tr');
//$mail->addAddress('tturna@*****.com.tr');
//$mail->addAddress('scifci@*****.com.tr');
 
//cc bölümü  
//$mail->addCC('tsonkaya@*****.com.tr');

// Email subject
$mail->Subject = 'Duyuru: ['. $row2['name'] .'] '. $title .''; // İleti konusu
 
// Set email format to HTML
$mail->isHTML(true);

// Email body content
$mailContent = '';

$mail->Body   = $ozet;

$json = array('email' => array('status' => false, 'msg' => ''), 'post' => array('status' => false, 'msg' => ''));

if(!$mail->send()) {
    $json['email']['msg'] = 'E-posta gönderilemedi: ' . $mail->ErrorInfo;
} else {
  $json['email']['status'] = true;
  $json['email']['msg'] = 'E-posta başarıyla gönderildi.';
}

// Veritabanı bağlantısını kapatın
mysqli_close($conn);

header('Content-type: application/json');

exit(json_encode($json));
?>