1

このコードはきれいではありませんが、最後に生成された自動インクリメント ID をテーブルから出力したいと考えています。studentcourseplan

<?php
session_start();
if (!isset($_SESSION['session_username']) ) { header ("Location: login.php");exit;} //If user in not signed in, redirect to login page

include("dbconfig.php");

if (isset($_POST['course_id'])) {

    $course_id = $_POST['course_id'];
    $student_id = $_POST['student_id'];
    $start_date = $_POST['start_date'];
    $end_date = $_POST['end_date'];
    
    $studentcourseplan_update = mysql_query("
    INSERT INTO studentcourseplan (student_id,cpl_startdate, cpl_enddate, cpl_coursename, cpl_pricevalue)
      SELECT '$student_id','$start_date', '$end_date', course_name, price_value
        FROM courses c
        INNER JOIN pricegroups p ON p.price_id = c.course_price_id
      WHERE c.course_id = '$course_id'");
      
    $result = mysql_query("SELECT LAST_INSERT_ID() FROM studentcourseplan");
    $row = mysql_fetch_assoc($result);
    $cpl_id = $row['cpl_id'];
    
    $studentcourseplanelements_update = mysql_query("
    INSERT INTO studentcourseplanelements (scpe_cpl_id, scpe_name, scpe_days)
      SELECT LAST_INSERT_ID(), cp.plan_name, cp.plan_time FROM courses c
        INNER JOIN course_to_plan cpl   ON cpl.course_id = c.course_id
        INNER JOIN courseplans cp       ON cp.plan_id = cpl.plan_id
    WHERE cpl.course_id = '$course_id'");
    
    $courseinfo = mysql_query("SELECT * FROM studentcourseplan WHERE cpl_id = '$cpl_id'") or die(mysql_error());

    if ($studentcourseplan_update === true) {
        
        while ($result = mysql_fetch_assoc($courseinfo)) {
            echo $result['cpl_id'];
        }
        
    } else if ($studentcourseplan_update === false){
        echo "Kunde inte uppdatera.";
    }
}
?>

24行目で泣き言を言います。これは次のとおりです。

$cpl_id = $row['cpl_id'];

私は得る:

未定義のインデックス: 24 行目の \Path\To\Page.php の cpl_id

4

1 に答える 1

3

LAST_INSERT_ID()最初の選択クエリでのみ選択したため:

$result = mysql_query("SELECT LAST_INSERT_ID() FROM studentcourseplan");
$row = mysql_fetch_assoc($result);
// Doesn't exist, only $row['LAST_INSERT_ID()']
$cpl_id = $row['cpl_id'];
// Probably you meant
$cpl_id = $row['LAST_INSERT_ID()'];

しかし、上記は不要です。

mysql_insert_id()代わりに、クエリを実行するのではなく、呼び出すだけで取得できます。

$cpl_id = mysql_insert_id();

セキュリティに関する注意:

クエリは、現在の形式では SQL インジェクションに対して脆弱です。mysql_real_escape_string()クエリ入力として使用されるすべての$_POST変数を必ず呼び出してください。

$course_id = mysql_real_escape_string($_POST['course_id']);
$student_id = mysql_real_escape_string($_POST['student_id']);
$start_date = mysql_real_escape_string($_POST['start_date']);
$end_date = mysql_real_escape_string($_POST['end_date']);

長期的には、mysql_*()関数から移行し、代わりに PDO や MySQLi などの準備済みステートメントをサポートする最新の API を使用することを学ぶことをお勧めします。

于 2012-06-11T23:40:00.343 に答える