اذهب إلى المحتوى
  • 0

مشكلة في كود php

Rol Ian

السؤال

<?php
require_once('database.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $fullname = $_POST["FName"];
    $email = $_POST["Email"];
    $feedback = $_POST["feedback"];

    if (empty($fullname) || empty($email) || empty($feedback)) {
        echo "Please fill in all required fields.";
        return;
    }

    $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES ($fullname, $email, $feedback)";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(":fullname", $fullname);
    $stmt->bindParam(":Email", $email);
    $stmt->bindParam(":feedback", $feedback);

    try {
        $stmt->execute();
        echo "Feedback submitted successfully!";
    } catch(PDOException $e) {
        echo "Error submitting feedback: " . $e->getMessage();
    }
}
       ?>

feedback.php

<?php

$hostName = "localhost";
$dbUser = "root";
$dbPassword = "";
$dbName = "feedBack";
$conn = mysqli_connect($hostName, $dbUser, $dbPassword, $dbName);
if (!$conn) {
    die("Something went wrong;");
}

?>

database.php

وظيفة صفحة  feedback.php  تجعل المستخدم يدخل بيانات وتضاف في جدول في قاعد البيانات ولكن عندما يضغط إرسال ذلك لا يعمل

 

تم التعديل في بواسطة Rol Ian
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 3 دقائق مضت قال Rol Ian:

image.thumb.png.d7a6a00929958757f1a3c3e34fd9a5db.png

يرجي ملاحظه ان الكود المرسل لا يحتوي علي إغلاق تعليمة if بقافلة } يجب ان تضع علامه } بعد هذا السطر mysqli_stmt_close($stmt);
وقبل هذا السطر ?>.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يوجد بعض الاخطاء:

في ملف الاتصال بقاعدة البيانات، يبدو أن هناك بعض التباس بين استخدام mysqli وPDO. كلاهما طريقتين ممتازتين للتفاعل مع قاعدة البيانات، لكن عليك ان تختار واحده فقط من بينهم؛  اختر إما mysqli أو PDO واستخدمها consistent في جميع أنحاء مشروعك.

عند كتابة استعلامات SQL، من المهم جدًا تجنب الحقن لكود خبيث في قاعدة بياناتك. تخيل أنك تكتب رسالة سرية وتريد التأكد من أن الشخص الوحيد الذي يمكنه فهمها هو الشخص المقصود. استخدام العلامات الاستفهام (?) أو الأسماء المستعارة (:placeholder) في استعلاماتك يشبه استخدام رموز سرية تضمن أن الرسالة (البيانات) تصل بأمان وبالطريقة التي تريدها.

لحماية قاعدة البيانات من اللصوص الرقميين الذين يحاولون "حقن" كود خبيث لسرقة البيانات أو التسبب في الفوضى، من الضروري استخدام طرق الربط مثل bindParam أو bindValue. هذا يشبه وضع قفل إلكتروني متطور على باب منزلك يتطلب مفاتيح رقمية خاصة للدخول.

بهذه الطريقة، تضمن أن تطبيقك يتحدث مع قاعدة البيانات بلغة مشفرة وآمنة، مما يحمي معلوماتك ويجعل تجربة المستخدم أكثر أمانًا واستقرارًا.

إذا قررت الاستمرار باستخدام PDO، إليك كيفية تحديث الكود:

في feedback.php:

// تأكد من أن الاستعلام يستخدم الأسماء المستعارة
$sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (:fullname, :email, :feedback)";
$stmt = $conn->prepare($sql);

// ربط القيم بالأسماء المستعارة باستخدام bindParam
$stmt->bindParam(":fullname", $fullname);
$stmt->bindParam(":email", $email);
$stmt->bindParam(":feedback", $feedback);

try {
    $stmt->execute();
    echo "Feedback submitted successfully!";
} catch(PDOException $e) {
    echo "Error submitting feedback: " . $e->getMessage();
}

وفي database.php، إذا كنت تريد استخدام PDO بدلاً من mysqli:

$hostName = "localhost";
$dbUser = "root";
$dbPassword = "";
$dbName = "feedBack";

// استخدام PDO للاتصال بقاعدة البيانات
try {
    $conn = new PDO("mysql:host=$hostName;dbname=$dbName", $dbUser, $dbPassword);
    // تعيين وضع الخطأ PDO ليكون exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("Something went wrong: " . $e->getMessage());
}

بعد فعل هذه التغييرات، يمكنك ان تجرب مره اخري ان تدخل بيانات وستسجل في قاعده البيانات.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أنت لم تقم بتضمين القيم المراد إدخالها في استعلام SQL بشكل صحيح، هناك أيضًا بعض الأخطاء الأخرى:

  • استخدم اقتباسات للقيم النصية في استعلام SQL.
  • لاحظ أنه يجب عليك استخدام اسماء الاعمدة المراد إدخال البيانات فيها بين قوسين في INSERT INTO.
  • استخدم اسماء المتغيرات بشكل صحيح مع استعلام الإدخال.
  • استخدم اسماء المتغيرات الصحيحة مع bindParam().
<?php
require_once('database.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $fullname = $_POST["FName"];
    $email = $_POST["Email"];
    $feedback = $_POST["feedback"];

    if (empty($fullname) || empty($email) || empty($feedback)) {
        echo "Please fill in all required fields.";
        return;
    }

    // تحسين استعلام SQL لتضمين قيم النص داخل اقتباسات
    $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (:fullname, :email, :feedback)";
    $stmt = $conn->prepare($sql);

    // ربط القيم المستخدمة مع معلمات الاستعلام باستخدام bindParam()
    $stmt->bindParam(":fullname", $fullname);
    $stmt->bindParam(":email", $email);
    $stmt->bindParam(":feedback", $feedback);

    try {
        $stmt->execute();
        echo "Feedback submitted successfully!";
    } catch(PDOException $e) {
        echo "Error submitting feedback: " . $e->getMessage();
    }
}
?>

بالطبع من المهم التأكد من أن متغيرات النموذج (مثل "FName" و "Email" و "feedback") تتطابق بالضبط مع الأسماء المستخدمة في نموذج HTML.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

وإذا أردت استخدام  mysqli هل تكون التعديلات هكذا؟

لأن الصفحات الأخرى كتبتها بطريقة mysqli

 $sql = "INSERT INTO feedback (full_name, email, feedBack) VALUES (?, ?, ?)";
    $stmt = mysqli_stmt_init($conn);
    $prepareStmt = mysqli_stmt_prepare($stmt,$sql);

     if ($prepareStmt) {
                mysqli_stmt_bind_param($stmt,"sss",$fullName, $email, $feedback);
                mysqli_stmt_execute($stmt);
                echo "<div class='alert alert-success'> successfully.</div>";
            }else{
                die("Something went wrong");
            }
       }
بتاريخ 21 دقائق مضت قال Khaled Osama3:

يوجد بعض الاخطاء:

في ملف الاتصال بقاعدة البيانات، يبدو أن هناك بعض التباس بين استخدام mysqli وPDO. كلاهما طريقتين ممتازتين للتفاعل مع قاعدة البيانات، لكن عليك ان تختار واحده فقط من بينهم؛  اختر إما mysqli أو PDO واستخدمها consistent في جميع أنحاء مشروعك.

عند كتابة استعلامات SQL، من المهم جدًا تجنب الحقن لكود خبيث في قاعدة بياناتك. تخيل أنك تكتب رسالة سرية وتريد التأكد من أن الشخص الوحيد الذي يمكنه فهمها هو الشخص المقصود. استخدام العلامات الاستفهام (?) أو الأسماء المستعارة (:placeholder) في استعلاماتك يشبه استخدام رموز سرية تضمن أن الرسالة (البيانات) تصل بأمان وبالطريقة التي تريدها.

لحماية قاعدة البيانات من اللصوص الرقميين الذين يحاولون "حقن" كود خبيث لسرقة البيانات أو التسبب في الفوضى، من الضروري استخدام طرق الربط مثل bindParam أو bindValue. هذا يشبه وضع قفل إلكتروني متطور على باب منزلك يتطلب مفاتيح رقمية خاصة للدخول.

بهذه الطريقة، تضمن أن تطبيقك يتحدث مع قاعدة البيانات بلغة مشفرة وآمنة، مما يحمي معلوماتك ويجعل تجربة المستخدم أكثر أمانًا واستقرارًا.

إذا قررت الاستمرار باستخدام PDO، إليك كيفية تحديث الكود:

في feedback.php:

// تأكد من أن الاستعلام يستخدم الأسماء المستعارة
$sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (:fullname, :email, :feedback)";
$stmt = $conn->prepare($sql);

// ربط القيم بالأسماء المستعارة باستخدام bindParam
$stmt->bindParam(":fullname", $fullname);
$stmt->bindParam(":email", $email);
$stmt->bindParam(":feedback", $feedback);

try {
    $stmt->execute();
    echo "Feedback submitted successfully!";
} catch(PDOException $e) {
    echo "Error submitting feedback: " . $e->getMessage();
}

وفي database.php، إذا كنت تريد استخدام PDO بدلاً من mysqli:

$hostName = "localhost";
$dbUser = "root";
$dbPassword = "";
$dbName = "feedBack";

// استخدام PDO للاتصال بقاعدة البيانات
try {
    $conn = new PDO("mysql:host=$hostName;dbname=$dbName", $dbUser, $dbPassword);
    // تعيين وضع الخطأ PDO ليكون exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("Something went wrong: " . $e->getMessage());
}

بعد فعل هذه التغييرات، يمكنك ان تجرب مره اخري ان تدخل بيانات وستسجل في قاعده البيانات.

تم التعديل في بواسطة Rol Ian
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 6 دقائق مضت قال Rol Ian:

وإذا أردت استخدام  mysqli هل تكون التعديلات هكذا؟

 

 $sql = "INSERT INTO feedback (full_name, email, feedBack) VALUES (?, ?, ?)";
    $stmt = mysqli_stmt_init($conn);
    $prepareStmt = mysqli_stmt_prepare($stmt,$sql);

     if ($prepareStmt) {
                mysqli_stmt_bind_param($stmt,"sss",$fullName, $email, $feedback);
                mysqli_stmt_execute($stmt);
                echo "<div class='alert alert-success'> successfully.</div>";
            }else{
                die("Something went wrong");
            }
       }

نعم، إذا أردت استخدام mysqli بدلاً من PDO، فهذه هي الطريقة الصحيحة لتحضير الاستعلام وتنفيذه بشكل آمن لمنع هجمات الحقن الـ SQL. ومع ذلك، يمكن تحسين الكود قليلاً لجعله أكثر وضوحًا وفعالية. إليك النسخة المحسنة:

// الاستعلام مع العلامات الاستفهام كعناصر نائبة للقيم
$sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (?, ?, ?)";
// تحضير الاستعلام
$stmt = mysqli_prepare($conn, $sql);

// التحقق من تحضير الاستعلام بشكل صحيح
if (!$stmt) {
    die("Something went wrong: " . mysqli_error($conn));
}

// ربط القيم المدخلة بالعناصر النائبة في الاستعلام
mysqli_stmt_bind_param($stmt, "sss", $fullname, $email, $feedback);

// تنفيذ الاستعلام
if (mysqli_stmt_execute($stmt)) {
    echo "<div class='alert alert-success'>Feedback submitted successfully.</div>";
} else {
    echo "<div class='alert alert-danger'>Error submitting feedback: " . mysqli_stmt_error($stmt) . "</div>";
}

// إغلاق البيان
mysqli_stmt_close($stmt);

لاحظ أنني استخدمت mysqli_error($conn) لطباعة الخطأ مباشرة إذا فشلت عملية التحضير، وmysqli_stmt_error($stmt) لطباعة الخطأ إذا فشلت عملية التنفيذ هذا يساعدك لتتمكن من تشخيص المشكلات بدقة وفعالية.

بالإضافة إلى ذلك، يجب دائما إغلاق البيان بعد الانتهاء منه باستخدام mysqli_stmt_close($stmt) لتضمن أن تطبيقك لا يستهلك موارد أكثر مما يحتاج ويبقى خادمك أو جهازك يعمل بسلاسة وفعالية، مما يساعد على تجنب المشاكل المحتملة المتعلقة بالأداء أو الذاكرة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 دقائق مضت قال Khaled Osama3:

نعم، إذا أردت استخدام mysqli بدلاً من PDO، فهذه هي الطريقة الصحيحة لتحضير الاستعلام وتنفيذه بشكل آمن لمنع هجمات الحقن الـ SQL. ومع ذلك، يمكن تحسين الكود قليلاً لجعله أكثر وضوحًا وفعالية. إليك النسخة المحسنة:

// الاستعلام مع العلامات الاستفهام كعناصر نائبة للقيم
$sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (?, ?, ?)";
// تحضير الاستعلام
$stmt = mysqli_prepare($conn, $sql);

// التحقق من تحضير الاستعلام بشكل صحيح
if (!$stmt) {
    die("Something went wrong: " . mysqli_error($conn));
}

// ربط القيم المدخلة بالعناصر النائبة في الاستعلام
mysqli_stmt_bind_param($stmt, "sss", $fullname, $email, $feedback);

// تنفيذ الاستعلام
if (mysqli_stmt_execute($stmt)) {
    echo "<div class='alert alert-success'>Feedback submitted successfully.</div>";
} else {
    echo "<div class='alert alert-danger'>Error submitting feedback: " . mysqli_stmt_error($stmt) . "</div>";
}

// إغلاق البيان
mysqli_stmt_close($stmt);

لاحظ أنني استخدمت mysqli_error($conn) لطباعة الخطأ مباشرة إذا فشلت عملية التحضير، وmysqli_stmt_error($stmt) لطباعة الخطأ إذا فشلت عملية التنفيذ هذا يساعدك لتتمكن من تشخيص المشكلات بدقة وفعالية.

بالإضافة إلى ذلك، يجب دائما إغلاق البيان بعد الانتهاء منه باستخدام mysqli_stmt_close($stmt) لتضمن أن تطبيقك لا يستهلك موارد أكثر مما يحتاج ويبقى خادمك أو جهازك يعمل بسلاسة وفعالية، مما يساعد على تجنب المشاكل المحتملة المتعلقة بالأداء أو الذاكرة.

 

<?php
require_once('database.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $fullname = $_POST["FName"];
    $email = $_POST["Email"];
    $feedback = $_POST["feedback"];

    if (empty($fullname) || empty($email) || empty($feedback)) {
        echo "Please fill in all required fields.";
        return;
    }
    

    $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (?, ?, ?)";
   $stmt = mysqli_prepare($conn, $sql);

    if (!$stmt) {
        die("Something went wrong: " . mysqli_error($conn));
    }
    mysqli_stmt_bind_param($stmt, "sss", $fullname, $email, $feedback);

    if (mysqli_stmt_execute($stmt)) {
        echo "<div class='alert alert-success'>Feedback submitted successfully.</div>";
    } else {
        echo "<div class='alert alert-danger'>Error submitting feedback: " . mysqli_stmt_error($stmt) . "</div>";
    }
    mysqli_stmt_close($stmt);

    ?>

لازال لايعمل

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 دقائق مضت قال Rol Ian:
<?php
require_once('database.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $fullname = $_POST["FName"];
    $email = $_POST["Email"];
    $feedback = $_POST["feedback"];

    if (empty($fullname) || empty($email) || empty($feedback)) {
        echo "Please fill in all required fields.";
        return;
    }
    

    $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (?, ?, ?)";
   $stmt = mysqli_prepare($conn, $sql);

    if (!$stmt) {
        die("Something went wrong: " . mysqli_error($conn));
    }
    mysqli_stmt_bind_param($stmt, "sss", $fullname, $email, $feedback);

    if (mysqli_stmt_execute($stmt)) {
        echo "<div class='alert alert-success'>Feedback submitted successfully.</div>";
    } else {
        echo "<div class='alert alert-danger'>Error submitting feedback: " . mysqli_stmt_error($stmt) . "</div>";
    }
    mysqli_stmt_close($stmt);

    ?>

لازال لايعمل

ارجو ارسال رساله الخطأ الذي تظهر لك.

يرجي ملاحظه ان الكود المرسل لا يحتوي علي إغلاق تعليمة if بقافلة }.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Khaled Osama3:

يرجي ملاحظه ان الكود المرسل لا يحتوي علي إغلاق تعليمة if بقافلة } يجب ان تضع علامه } بعد هذا السطر mysqli_stmt_close($stmt);
وقبل هذا السطر ?>.

إنه بالفعل يعمل

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...