2017-06-05 43 views
1

我很新编程,所以很抱歉,如果这是一个愚蠢的问题。我想知道如果我做错了什么或者是否有更好的方法来解决我的问题。我使用AJAX将信息提交给php处理程序,然后基本上用更新的信息替换我的页面上的数据,以便页面不必每次都刷新。AJAX和PHP有问题

这是我的AJAX代码。

<script> 
    $(document).ready(function(){ 
     $("#start<?php echo $rowCount; ?>").click(function(){ 
         $("#displayJobs").load("assemblyStartHandlerCopy.php", { 
          jobID: <?php echo $jobID; ?>, 
          roomID: <?php echo $roomID; ?>, 
          finishColor: '<?php echo $finishColor; ?>', 
          startTime: '<?php echo $assemblyS; ?>' 
         }); 
         $("#displayJobsNotStarted").load("assemblyNotStartedCount.php"); 
        }); 
       }); 
</script> 

我的PHP代码是

<?php include "../../../includes/db.php"; ?> 
<?php 
    $startBtnColor = ""; 
    $completeBtnColor = ""; 
    $onQlistStatus = "On Q-List"; 
?> 

<!--IF START BUTTON UPDATE DATA--> 
<?php 
date_default_timezone_set("America/Denver"); 
if(isset($_POST['jobID'])) { 
    $jobID = $_POST['jobID']; 
    $roomID = $_POST['roomID']; 
    $finishColor = $_POST['finishColor']; 
    $startTime = $_POST['startTime']; 
    $start = date("Y-m-d H:i:s"); 

    if($startTime == NULL || $startTime == 0) { 
     $startTime = $start; 
    } 
    elseif($startTime != NULL || $startTime == 0) { 
     $startTime = 0; 
    }; 

$querySetStart = "UPDATE rooms SET assemblyS = '$startTime' WHERE jobID = $jobID AND finishColor = '$finishColor'"; 
$resultSetStart = mysqli_query($connect, $querySetStart); 

if(!$resultSetStart) { 
    echo "Start Button Failed " . mysqli_error($connect); 
}; 
?> 

<!--GET AND DISPLAY JOBS--> 
    <table> 
      <tr> 
       <th class="rowStart">Start</th> 
       <th class="rowJobName">Job Name</th> 
       <th class="rowWoodType">Wood Type</th> 
       <th class="rowFinishColor">Finish Color</th> 
       <th class="rowComplete">Complete</th> 
      </tr> 
<?php 
    $query = "SELECT 
     jobs.jobID, 
     jobs.jobName, 
     rooms.roomID, 
     rooms.roomName, 
     rooms.assemblyS, 
     rooms.assemblyF, 
     rooms.assemblyNeeded, 
     rooms.woodType, 
     rooms.finishType, 
     rooms.finishColor 
     FROM jobs 
     LEFT JOIN rooms 
     ON jobs.jobID = rooms.jobID 
     WHERE rooms.assemblyNeeded = 1 AND jobs.status = '$onQlistStatus' AND rooms.assemblyF IS NULL 
     OR rooms.assemblyNeeded = 1 AND jobs.status = '$onQlistStatus' AND rooms.assemblyF = 0 
     GROUP BY jobs.jobName, rooms.finishColor 
     ORDER BY deliveryDate, jobName, finishColor LIMIT 100"; 

    $result = mysqli_query($connect, $query); 

    $x = 1; 
    $rowCount = 1; 

    if ($result) { 
    while($row = mysqli_fetch_assoc($result)) { 
     $jobID = $row['jobID']; 
     $jobName = $row['jobName']; 
     $woodType = $row['woodType']; 
     $finishColor = $row['finishColor']; 
     $roomID = $row['roomID']; 
     $assemblyS = $row['assemblyS']; 
     $assemblyF = $row['assemblyF']; 
//SET BUTTON BACKGROUND COLOR 
     if ($assemblyS != NULL) { 
      $startBtnColor = "green"; 
     }; 
     if ($assemblyS == NULL || $assemblyS == 0) { 
      $startBtnColor = "white"; 
     }; 
//ALTERNATE ROW COLOR 
     $x++; 
     if ($x%2 == 0) { 
      $class1 = "backgroundColor1"; 
     } 
     else { 
      $class1 = "backgroundColor2"; 
     }; 
//DISPLAY ROW INFORMATION 
     $start = "<td class='rowStart'><button id='start$rowCount' style='background-color: $startBtnColor'>Start</button></td>"; 
     ?> 
      <script> 
       $(document).ready(function(){ 
        $("#start<?php echo $rowCount; ?>").click(function(){ 
         $("#displayJobs").load("assemblyStartHandlerCopy.php", { 
          jobID: <?php echo $jobID; ?>, 
          roomID: <?php echo $roomID; ?>, 
          finishColor: '<?php echo $finishColor; ?>', 
          startTime: '<?php echo $assemblyS; ?>' 
         }); 
         $("#displayJobsNotStarted").load("assemblyNotStartedCount.php"); 
        }); 
       }); 
      </script> 
     <?php 
     $jobName = "<td class='$class1 rowJobName'>$jobName</td>"; 
     $woodType = "<td class='$class1 rowWoodType'>$woodType</td>"; 
     $finishColorRow = "<td class='$class1 rowFinishColor'>$finishColor</td>"; 

     $complete = "<td class='rowComplete'><button id='complete$rowCount' style='background-color: $completeBtnColor'>Complete</button></td>"; 
      ?> 
      <script> 
       $(document).ready(function() { 
        $("#complete<?php echo $rowCount; ?>").click(function() { 
         $("#displayJobs").load("assemblyCompleteHandlerCopy.php", { 
          jobID: <?php echo $jobID; ?>, 
          roomID: <?php echo $roomID; ?>, 
          finishColor: '<?php echo $finishColor; ?>', 
          completeTime: '<?php echo $assemblyS; ?>' 
         }, function(responseTxt, statusTxt, xhr) { 
          if(statusTxt == "success") { 
          //DO NOTHING  
          }; 
          if(statusTxt == "error") { 
           alert("Error: " + xhr.status + ": " + xhr.statusText); 
          }; 
         }); 

        $("#displayJobsNotStarted").load("assemblyNotStartedCount.php"); 
        $("#recentlyCompleted").load("assemblyRecentlyCompletedHandler.php", { 
         complete: 1 
        }, function(responseTxt, statusTxt, xhr) { 
          if(statusTxt == "success") { 
          //DO NOTHING  
          }; 
          if(statusTxt == "error") { 
           alert("Error: " + xhr.status + ": " + xhr.statusText); 
          }; 
         }); 
        }); 
       }); 
      </script> 
      <?php 
     echo "<tr>" . $start . $jobName . $woodType . $finishColorRow . $complete . "</tr>"; 
     $rowCount++; 
    }; 
    }; 
?> 
      </table> 
<?php 
} 
?> 

我知道这是相当混乱。基本上所有的信息都被拉入表格,并通过一个while循环来回显行。然后,如果我选择与“作业”或“行”相关联的按钮,则第一个标记是开始时间,第二个是更改颜色,第三个是新的计数。 有没有更好的方法来做到这一点或确保我的代码不会触发,除非它是成功的。

对我来说,奇怪的是我的代码被复制到PHP处理程序中。如果我刷新页面,则每次都可以正确显示,而且没有任何问题。

+0

我会建议让他们更加分离,使用AJAX将数据发布到PHP并让PHP返回JSON数据。 – Twisty

回答

1

正如所建议的,我会创建一个可以与AJAX一起使用的独立PHP脚本。这可能是这样的:

PHP

<?php 
include "../../../includes/db.php"; 
$startBtnColor = ""; 
$completeBtnColor = ""; 
$onQlistStatus = "On Q-List"; 

date_default_timezone_set("America/Denver"); 
if(isset($_POST['jobID'])) { 
    $jobID = $_POST['jobID']; 
    $roomID = $_POST['roomID']; 
    $finishColor = $_POST['finishColor']; 
    $startTime = $_POST['startTime']; 
    $start = date("Y-m-d H:i:s"); 
    if($startTime == NULL || $startTime == 0) { 
     $startTime = $start; 
    } elseif($startTime != NULL || $startTime == 0) { 
     $startTime = 0; 
    } 

    if($stmt = $connection->prepare("UPDATE rooms SET assemblyS = '?' WHERE jobID = ? AND finishColor = '?'")){ 
     $stmt->bind_param("sis", $startTime, $jobID, $finishColor); 
     if($stmt->execute()){ 
      $stmt->close(); 
      echo "Update Start Button Failed " . mysqli_error($connect); 
      $connection->close(); 
      die(); 
     } 
    } 
    $connection->close(); 
    die(); 
} 

$query = $connection->prepare("SELECT 
     jobs.jobID, 
     jobs.jobName, 
     rooms.roomID, 
     rooms.roomName, 
     rooms.assemblyS, 
     rooms.assemblyF, 
     rooms.assemblyNeeded, 
     rooms.woodType, 
     rooms.finishType, 
     rooms.finishColor 
     FROM jobs 
     LEFT JOIN rooms 
     ON jobs.jobID = rooms.jobID 
     WHERE rooms.assemblyNeeded = 1 AND jobs.status = '?' AND rooms.assemblyF IS NULL 
     OR rooms.assemblyNeeded = 1 AND jobs.status = '?' AND rooms.assemblyF = 0 
     GROUP BY jobs.jobName, rooms.finishColor 
     ORDER BY deliveryDate, jobName, finishColor LIMIT 100"); 
if($query){ 
    $query->bind_param("ss",$onQlistStatus,$onQlistStatus); 
    $query->execute(); 
    $query->bind_result($result); 

    $x = 1; 
    $rowCount = 1; 
    $results = array(); 

    if ($result) { 
     while($row = mysqli_fetch_assoc($result)) { 
      $results[] = array(
       'jobID' => $row['jobID'], 
       'jobName' => $row['jobName'], 
       'woodType' => $row['woodType'], 
       'finishColor' => $row['finishColor'], 
       'roomID' => $row['roomID'], 
       'assemblyS' => $row['assemblyS'], 
       'assemblyF' => $row['assemblyF'], 
       //SET BUTTON BACKGROUND COLOR 
       'assemblyS' => ($startBtnColor != NULL) ? "green" : "white", 
       //ALTERNATE ROW COLOR 
       'class1' => (!$x++%2) ? "backgroundColor1" : "backgroundColor2" 
      ); 
      $rowCount++; 
     } 
    } 
    $query->close(); 
} 
$connection->close(); 
header('Content-Type: application/json'); 
echo json_encode($results); 
?> 

如果POST到这一点,就会更新数据库。如果你为此运行GET,你将得到JSON数据。

这可以让你保持你的所有JavaScript在你的HTML。这使得事情更容易排除故障。它还允许您随时调用数据。只需使用$.getJSON()即可提取数据。

MySQLi提供prepare,我强烈建议使用。这将有助于再次保护SQL注入尝试。您目前的代码容易受到这些攻击。

您的数据将以对象数组的形式返回。类似于:

[{ 
    'jobID': 1, 
    'jobName': "job1", 
    'woodType': "hardwood", 
    'finishColor': "cherry", 
    'roomID': "room1", 
    'assemblyS': "2017-06-30 09:00:00", 
    'assemblyF': "2017-06-30 16:00:00", 
    'startBtnColor': "green", 
    'class1': "backgroundColor1" 
}, { 
    'jobID': 2, 
    'jobName': "job1", 
    'woodType': "hardwood", 
    'finishColor': "cherry", 
    'roomID': "room2", 
    'assemblyS': "2017-07-01 09:00:00", 
    'assemblyF': "2017-07-01 16:00:00", 
    'startBtnColor': "green", 
    'class1': "backgroundColor2" 
}, { 
    'jobID': 3, 
    'jobName': "job1", 
    'woodType': "hardwood", 
    'finishColor': "cherry", 
    'roomID': "room3", 
    'assemblyS': "2017-07-02 09:00:00", 
    'assemblyF': "2017-07-02 16:00:00", 
    'startBtnColor': "green", 
    'class1': "backgroundColor1" 
}]; 

我会建议使用$.each()迭代数据。你可以建立你的表关闭此像这样:

https://jsfiddle.net/Twisty/wkt9jnrq/

HTML

<table id="startJobs"> 
    <thead> 
    <tr> 
     <th class="rowStart">Start</th> 
     <th class="rowJobName">Job Name</th> 
     <th class="rowWoodType">Wood Type</th> 
     <th class="rowFinishColor">Finish Color</th> 
     <th class="rowComplete">Complete</th> 
    </tr> 
    </thead> 
    <tbody> 
    </tbody> 
</table> 

的JavaScript

$.each(myData, function(k, o) { 
    var btn = $("<button>", { 
     id: "start-" + o.jobID 
     }) 
     .css("background-color", o.startBtnColor) 
     .html("Start") 
     .click(function(e) { 
     $.post("assemblyStartHandlerCopy.php", { 
      jobID: o.jobID, 
      roomID: o.roomID, 
      finishColor: o.finishColor, 
      startTime: o.assemblyS 
     }, function(result) { 
      if (result.length) { 
      alert(result); 
      } 
     }); 
     }); 
    var row = $("<tr>").appendTo("#startJobs tbody"); 
    row.append($("<td>", { 
     class: "rowStart " + o.class1 
     }).append(btn), 
     $("<td>", { 
     class: "rowJobName " + o.class1 
     }).html(o.jobName), 
     $("<td>", { 
     class: "rowWoodType " + o.class1 
     }).html(o.woodType), 
     $("<td>", { 
     class: "rowFinishColor " + o.class1 
     }).html(o.finishColor), 
     $("<td>", { 
     class: "rowComplete " + o.class1 
     }).html(o.assemblyF)); 
    }); 

您可以从success回调中喂$.each()$.getJSON()

0

那么在这段代码中你可以改进很多东西。

首先,你不应该直接从PHP写入JavaScript到JavaScript的值,你应该将它们存储在变量中,并为JavaScript分开文件并使用这些变量。

其次,在将它们写入数据库以避免可能的SQL注入之前,应使用addslashes方法将值转义。

你现在正在做的是将所有代码写入一个使代码难以理解的文件中。使用方法/函数组织代码并将其划分为可管理的块,并在需要时提供单独的文件。

+0

小心添加一些例子? – Dale

+2

请注意,'addslashes'方法不够。您应该使用预配置的语句或带有配置的字符集的mysqli_real_escape_string。 – Nathan

+0

感谢您的加入@Nathan –