2012-12-11 37 views
2

下面是一个php/mysqli代码,它假设将courseid和模块ID插入到数据库中,然后执行查询以选择课程详细信息以查找插入课程的课程详细信息,然后最终运行最终查询确保插入的courseid和moduleid在数据库中。var_dump()正在输出字符串(0)“”,这是为什么?

<?php 
    error_reporting(E_ALL); 
    ini_set('display_errors', 1); 
    // connect to the database 
    include('connect.php'); 

     /* check connection */ 
     if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     die(); 
     } 

    $courseid = (isset($_POST['courses'])) ? $_POST['courses'] : ''; 
    $moduleid = (isset($_POST['moduleid'])) ? $_POST['moduleid'] : ''; 
    $moduleno = (isset($_POST['moduleno'])) ? $_POST['moduleno'] : ''; 
    $modulename = (isset($_POST['modulename'])) ? $_POST['modulename'] : '';  

    var_dump($courseid); 

    $insertsql = " 
    INSERT INTO Course_Module 
    (CourseId, ModuleId) 
    VALUES 
    (?, ?) 
    "; 
    if (!$insert = $mysqli->prepare($insertsql)) { 
    // Handle errors with prepare operation here 
    }           

    $insert->bind_param("ii", $courseid, $moduleid); 

    $insert->execute(); 

    if ($insert->errno) { 
    // Handle query error here 
    } 

    $insert->close(); 

    $coursequery = " 
    SELECT DISTINCT CourseNo, CourseName 
    FROM Course c 
    INNER JOIN Course_Module cm 
    ON 
    c.CourseId = cm.CourseId 
    WHERE cm.CourseId = ?"; 
    // prepare query 
    $coursestmt=$mysqli->prepare($coursequery); 
    // You only need to call bind_param once 
    $coursestmt->bind_param("i", $courseid); 
    // execute query 
    $coursestmt->execute(); 
    // get result and assign variables (prefix with db) 
    $coursestmt->bind_result($dbCourseNo, $dbCourseName); 

    $query = "SELECT CourseId, ModuleId FROM Course_Module WHERE CourseId = ? AND ModuleId = ?"; 
    // prepare query 
    $stmt=$mysqli->prepare($query); //line 58 error 
    // You only need to call bind_param once 
    $stmt->bind_param("ii", $courseid, $moduleid); //line 60 error 
    // execute query 
    $stmt->execute(); 
    // get result and assign variables (prefix with db) 
    $stmt->bind_result($dbCourseId, $dbModuleId); 
    //get number of rows 
    $stmt->store_result(); 
    $numrows = $stmt->num_rows(); 

    if ($numrows == 1){ 

    echo "<span style='color: green'>The following Module has been added into Course:" . $dbCourseNo . " - " . $dbCourseName . ":<br/>" . $moduleno . " - " . $modulename . "</span>"; 

    }else{ 

    echo "<span style='color: red'>An error has occured, Module has not been added into the Course</span>"; 

    } 

      ?> 

好的问题我得到的上面的代码是,它不执行插入的CourseId和ModuleId字段。它只是为两个字段插入值0。我的问题是为什么会这样:

下面是两种形式:

$addmodule = " 
<form id='detailsForm'> 

    <p><strong>Module Details</strong></p> 
    <table> 
    <tr> 
    <th></th> 
    <td><input type='hidden' id='idmodule' name='moduleid' value='' /> </td> 
    </tr> 
    <tr> 
    <th>Module ID:</th> 
    <td><input type='text' id='nomodule' name='moduleno' readonly='readonly' value='' /> </td> 
    </tr> 
    <tr> 
    <th>Module Name:</th> 
    <td><input type='text' id='namemodule' name='modulename' readonly='readonly' value='' /> </td> 
    </tr> 
    </table> 

    </form> 
"; 

$moduleForm = " 
<form action='".htmlentities($_SERVER['PHP_SELF'])."' method='post' id='moduleForm'> 
{$outputcourse} 
{$hiddencourse} 
<p><strong>Add Module</strong></p> 
<p><strong>Module:</strong> {$moduleHTML} </p> 
</form>"; 

下面是它使用AJAX导航到PHP代码右侧的更新以上执行插入到数据库的代码:

function submitform() {  

    $.ajax({ 
     type: "POST", 
     url: "insertmoduletocourse.php", 
     data: { detailsForm: $('#detailsForm').serialize(), moduleForm : $('#moduleForm').serialize() }, 
     success: function(html){ 
      $("#targetdiv").html(html); 
      $('#targetdiv').show(); 

     } 
    });   
} 

当我执行var_dump($courseid) and var_dump($moduleid),它输出该:string(0) "" string(0) ""

下面是在此它显示课程和模块在各自的下拉菜单的代码:

$courseactive = 1; 

    $sql = "SELECT CourseId, CourseNo, CourseName FROM Course WHERE CourseActive = ? ORDER BY CourseNo"; 

    $sqlstmt=$mysqli->prepare($sql); 

    $sqlstmt->bind_param("i",$courseactive); 

    $sqlstmt->execute(); 

    $sqlstmt->bind_result($dbCourseId, $dbCourseNo, $dbCourseName); 

    $courses = array(); // easier if you don't use generic names for data 

    $courseHTML = ""; 
    $courseHTML .= '<select name="courses" id="coursesDrop">'.PHP_EOL; 
    $courseHTML .= '<option value="">Please Select</option>'.PHP_EOL; 

    $outputcourse = ""; 
    $hiddencourse = ""; 

    while($sqlstmt->fetch()) 
    { 
    $course = $dbCourseId; 
    $courseno = $dbCourseNo; 
    $coursename = $dbCourseName; 
    $courseHTML .= "<option value='".$course."'>" . $courseno . " - " . $coursename . "</option>".PHP_EOL; 

    if (isset($_POST['courses']) && ($_POST['courses'] == $course)) { 
    $outputcourse .= "<p><strong>Course:</strong> " . $courseno . " - " . $coursename . "</p>"; 
    $hiddencourse .= "<p><input type='hidden' id='hiddencourse' value='". $courseno . " - " . $coursename ."'></p>"; 
} 

    } 

    $courseHTML .= '</select>'; 

    $moduleInfo = array(); 


    //get the form data 
$coursesdrop = (isset($_POST['courses'])) ? $_POST['courses'] : ''; 
$moduleactive = 1; 

$modulequery = " 
SELECT 
m.ModuleId, m.ModuleNo, m.ModuleName, m.Credits 
FROM 
Module m 
WHERE 
m.ModuleId NOT IN (
SELECT cm.ModuleId 
FROM Course_Module cm 
WHERE cm.CourseId = ? 
) AND m.ModuleActive = ? 
ORDER BY m.ModuleNo 
"; 

$moduleqrystmt=$mysqli->prepare($modulequery); 
// You only need to call bind_param once 
$moduleqrystmt->bind_param("ii",$coursesdrop, $moduleactive); 
// get result and assign variables (prefix with db) 

$moduleqrystmt->execute(); 

$moduleqrystmt->bind_result($dbModuleId,$dbModuleNo,$dbModuleName,$dbCredits); 

$moduleqrystmt->store_result(); 

$modulenum = $moduleqrystmt->num_rows();  

$moduleHTML = '<select name="module" id="modulesDrop">'.PHP_EOL; 
$moduleHTML .= '<option value="">Please Select</option>'.PHP_EOL;   

while ($moduleqrystmt->fetch()) { 

$moduleHTML .= sprintf("<option value='%s'>%s - %s</option>", $dbModuleId, $dbModuleNo, $dbModuleName) . PHP_EOL; 

$moduleData = array(); 
$moduleData["ModuleId"] = $dbModuleId; 
$moduleData["ModuleNo"] = $dbModuleNo; 
$moduleData["ModuleName"] = $dbModuleName; 
$moduleData["Credits"] = $dbCredits; 

array_push($moduleInfo, $moduleData); 

} 


$moduleHTML .= '</select>'; 

- 更新:

的Ajax/jquery的下面:

function submitform() {  

     $.ajax({ 
      type: "POST", 
      url: "insertmoduletocourse.php", 
      data: { 
     courses: $('#coursesDrop').val(), 
     moduleid: $('#idmodule').val(), 
     moduleno: $('#nomodule').val(), 
     modulename: $('#namemodule').val() 
    }, 
      success: function(html){ 
       $("#targetdiv").html(html); 
       $('#targetdiv').show(); 

       var selectedOption = jQuery("#modulesDrop option:selected"); 
       selectedOption.appendTo($("#moduleselect")); 

        //Clear fields 
        jQuery("#idmodule").val(""); 
        jQuery("#nomodule").val(""); 
        jQuery("#namemodule").val(""); 
        jQuery("#credits").val(""); 
      } 
     });   
    } 

下面是$ courseHTML回音:

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" onsubmit="return validation();"> 
<table> 
<tr> 
<th>Course: <?php echo $courseHTML; ?></th> 
</tr> 
</table> 
<p><input id="courseSubmit" type="submit" value="Submit Course" name="courseSubmit" /></p> 
<div id="courseAlert"></div> 
<div id="targetdiv"></div> 
</form> 
+0

请参阅http://stackoverflow.com/questions/3632075/mysqli-giving-commands-out-of-sync-error-why在调用'bind_param()'之前,您可能需要从'$ coursestmt'获取额外的行'$ stmt' –

+0

@MichaelBerkowski好吧,错误已经被删除,这要归功于所提供的链接中提到的store_result()。但是它不会将任何数据插入到数据库中,而是会为这两个字段插入0。我可以更新我的问题以显示我目前的问题吗? – user1881090

+0

是的,我觉得可以更新它,因为它还没有答案。也相应地更改问题标题。 –

回答

1

在地方的var_dump($courseid);print_r($_POST);,检查有
1,如果你有一个价值课程[courses] => 'theCoursesValue'
2 - 它不是在其他数组“缩进”(键)

// this is a print_r($_POST) plus my comments 
Array 
(
    [courses] => theCoursesValue    // access this value by $_POST['courses'] 
               // in your case may be empty or inexistent 
    [otherkey] => otherValue 
    [indented] => Array 
     (
      [internalKey] => internalValue 
      [courses] => thisOneIsNotDirect  // access this value by $_POST['indented']['courses'] 
     ) 

) 

更新
你可以这样说:

$.ajax({ 
    type: "POST", 
    url: "insertmoduletocourse.php", 
    data: { 
     // an html field must exist for each one of this, with matching id='...blabla...' 
     // may be textbox(text), textarea, hidden. 
     // be sure that they were generated using "view source code" on the browser 
     // again use print_r($_POST) to check 
     courses: $('#coursesDrop option:selected').val(), // for selects 
     moduleid: $('#moduleid').val(), 
     moduleno: $('#moduleno').val(), 
     modulename: $('#modulename').val() 
    }, 
    success: function(html){ 
     $("#targetdiv").html(html); 
     $('#targetdiv').show(); 
    } 
}); 
+0

嗨,这是它打印时将其更改为print_r($ _ POST)'Array([detailsForm] => moduleid = 1&moduleno = CHI2513&modulename = Systems + Strategy&creditsname = 20 [moduleForm] => module = 1)' – user1881090

+0

好吧,你可以看到没有发布'课程'。取而代之的是'detailsForm'和'amoduleForm',它们是$ .ajax方法收集的两个变量。所以你需要改变你收集到的信息(也许你“包装”的价值,我的意思是。序列化) –

+0

你知道我应该改变它吗?我在努力 – user1881090

相关问题