2016-10-06 10 views
1

テーブルのすべての行とカラムをテキストフィールドと同時に読み込んで同時に編集できるようにした後、送信ボタンを押しますすべての値で更新されました。PHP/MySQLはテーブルが特定の数の行に達した後に更新します

ボタンを追加すると、行が追加または削除されます。基本的に在庫システムです。

私のテーブルが約150行に達してから、スクリプトがすべてのテーブルの値を表示しますが、更新と削除はもう機能しなくなります。新しい行を追加してもまだ動作しています。

エラーはありません。更新プログラムが実際に動作しているときとまったく同じように見えます。私は最近のバージョンのWAMPを実行しています。

メモリの問題のようです。

PHP.ini 
memory_limit = 2048M 
post_max_size = 128M 
upload_max_filesize = 64M 

MY.ini 
innodb_buffer_pool_size = 512M 
key_buffer_size = 256M 
max_allowed_packet = 128M 
sort_buffer_size = 128M 
net_buffer_length = 8K 
read_buffer_size = 64M 
read_rnd_buffer_size = 64M 
myisam_sort_buffer_size = 512M 
ead_buffer_size = 10M 
write_buffer_size = 10M 
sort_buffer_size_size = 40M 
net_buffer_length = 64K 

私のテーブルは、現時点では17列があります:私は逃したシンプルなものがあるかもしれないので、それはデータベースの操作初めてです、以下の修正を試みました。列を削除すると、10または20の新しい行を追加できますが、問題は再び発生します。

私の質問: 1.どうすれば不正なコードが動作するのですか? 2.「適切に処理する」ためにコードをクリーンアップするにはどうすればよいですか。

私のコードはセキュリティ上の問題の可能性が最も高いですが、これが私の最初のプロジェクトであり、理解できない場合は、あなたの1つのライナー。

問題ページのコードです。私のテーブルが小さければ、それは完璧にうまく動作することを忘れないでください。私のUPDATE機能は5つのUPDATEに分かれていますが、これは単なるテストではありませんでした。もともとはすべてが単一のUPDATEでした。

@Philからの提案を取る
 <?php 
include_once $_SERVER['DOCUMENT_ROOT'] . "/NAMAsoft/mochaOFFICE/main/links_config.php"; 
include_once ($standard_headtag); 
ini_set('memory_limit', '1024M'); 
?> 
</head> 
<body style=''> 

<?php 
include ($DBconnect); 
$tbl_name="inventorylist"; // Table name 
echo ini_get("memory_limit")."\n"; 
ini_set("memory_limit","2048M"); 
echo ini_get("memory_limit")."\n"; 

echo " 
<style> 
table { width:1200px;table-layout:fixed;} 
table tr { height:1em; } 
td {overflow:hidden;white-space:nowrap; } 
</style> 
<form name='form1' method='post' action=''> 
<table border='0' cellspacing='1' cellpadding='0'> 
<tr> 
<td width='80px' align='center'><strong>Department</strong></td> 
<td width='80px' align='center'><strong>品名</strong></td> 
<td width='80px' align='center'><strong>Product#</strong></td> 
<td width='80px' align='center'><strong>Maker</strong></td> 
<td width='80px' align='center'><strong>Cost</strong></td> 
<td width='80px' align='center'><strong>/Per</strong></td> 
<td width='80px' align='center'><strong>Import Fee %</strong></td> 
<td width='80px' align='center'><strong>Prep Cost</strong></td> 
<td width='80px' align='center'><strong>MOQ</strong></td> 
<td width='80px' align='center'><strong>Weight</strong></td> 
<td width='80px' align='center'><strong>Size (t)</strong></td> 
<td width='80px' align='center'><strong>Category</strong></td> 
<td width='80px' align='center'><strong>Page</strong></td> 
<td width='80px' align='center'><strong>Specs</strong></td> 
<td width='80px' align='center'><strong>Comment</strong></td> 
<td width='80px' align='center'><strong>Stock</strong></td> 
</tr> 
</td> 
<td align='center'> 
     <select name='department_add' id='department_add' data-native-menu='false'>"; 
     $sql1 = "SELECT * FROM menulist"; 
     $result1 = $conn->query($sql1); 
     if ($result1->num_rows > 0) { 
     $count1 = $result1->num_rows; 
     // output data of each row 
     while($row1 = $result1->fetch_assoc()) { 
     echo "<option value='".$row1['department']."'>".$row1['department']."</option>";} 
     } else { 
     echo "Error: " . $sql1 . "<br>" . $conn->error; 
     } 
      echo " 
     </select> 
</td> 
<td align='center'> 
<input name='productname_add' type='text' id='productname_add' value=''> 
</td> 
<td align='center'> 
<input name='productnum_add' type='text' id='productnum_add' value=''> 
</td> 
<td align='center'> 
<input name='maker_add' type='text' id='maker_add' value=''> 
</td> 
<td align='center'> 
<input name='cost_add' type='text' id='cost_add' value=''> 
</td> 
<td align='center'> 
<input name='per_add' type='text' id='per_add' value=''> 
</td> 
<td align='center'> 
<input name='importfee_add' type='text' id='importfee_add' value=''> 
</td> 
<td align='center'> 
<input name='prepcost_add' type='text' id='prepcost_add' value=''> 
</td> 
<td align='center'> 
<input name='MOQ_add' type='text' id='MOQ_add' value=''> 
</td> 
<td align='center'> 
<input name='weight_add' type='text' id='weight_add' value=''> 
</td> 
<td align='center'> 
<input name='sizeT_add' type='text' id='sizeT_add' value=''> 
</td> 
<td align='center'> 
     <select name='category_add' id='category_add' data-native-menu='false'>"; 
     $sql2 = "SELECT * FROM menulist"; 
     $result2 = $conn->query($sql2); 
     if ($result2->num_rows > 0) { 
     $count2 = $result2->num_rows; 
     // output data of each row 
     while($row1 = $result2->fetch_assoc()) { 
     echo "<option value='".$row1['category']."'>".$row1['category']."</option>";} 
     } else { 
     echo "Error: " . $sql2 . "<br>" . $conn->error; 
     } 
     echo " 
     </select> 
</td> 
<td align='center'> 
     <select name='page_add' id='page_add' data-native-menu='false'>"; 
     $sql3 = "SELECT * FROM menulist"; 
     $result3 = $conn->query($sql3); 
     if ($result3->num_rows > 0) { 
     $count3 = $result3->num_rows; 
     // output data of each row 
     while($row1 = $result3->fetch_assoc()) { 
     echo "<option value='".$row1['page']."'>".$row1['page']."</option>";} 
     } else { 
     echo "Error: " . $sql3 . "<br>" . $conn->error; 
     } 
     echo " 
     </select> 
</td> 
<td align='center'> 
<input name='specs_add' type='text' id='specs_add' value=''> 
</td> 
<td align='center'> 
<input name='comment_add' type='text' id='comment_add' value=''> 
</td> 
<td align='center'> 
<input name='stock_add' type='text' id='stock_add' value=''> 
</td> 
</tr> 
</table> 
<input type='submit' name='Add' value='Add'> 
</form> 
<br> 
<br>"; 




echo " 
<style> 
table { width:1260px;table-layout:fixed;} 
table tr { height:1em; } 
td {overflow:hidden;white-space:nowrap; } 
</style> 
<form name='form1' method='post' action=''> 
<table border='0' cellspacing='1' cellpadding='0'> 
<tr> 
<td width='30px' align='center'><strong>DEL</strong></td> 
<td width='30px' align='center'><strong>Id</strong></td> 
<td width='80px' align='center'><strong>Department</strong></td> 
<td width='80px' align='center'><strong>品名</strong></td> 
<td width='80px' align='center'><strong>Product#</strong></td> 
<td width='80px' align='center'><strong>Maker</strong></td> 
<td width='80px' align='center'><strong>Cost</strong></td> 
<td width='80px' align='center'><strong>/Per</strong></td> 
<td width='80px' align='center'><strong>Import Fee %</strong></td> 
<td width='80px' align='center'><strong>Prep Cost</strong></td> 
<td width='80px' align='center'><strong>MOQ</strong></td> 
<td width='80px' align='center'><strong>Weight</strong></td> 
<td width='80px' align='center'><strong>Size (t)</strong></td> 
<td width='80px' align='center'><strong>Category</strong></td> 
<td width='80px' align='center'><strong>Page</strong></td> 
<td width='80px' align='center'><strong>Specs</strong></td> 
<td width='80px' align='center'><strong>Comment</strong></td> 
<td width='80px' align='center'><strong>Stock</strong></td> 
</tr>"; 

$sql = "SELECT * FROM $tbl_name"; 
$result = $conn->query($sql); 
if ($result->num_rows > 0) { 
    $count = $result->num_rows; 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 

echo " 
<tr> 
<td align='center'> 
<input type='checkbox' name='checkbox[]' value='" .$row['id']. "'> 
</td> 
<td align='center'> "; 
$id[]=$row['id']; 
echo $row['id']; 
echo " 
</td> 

<td align='center'> 
<input name='department[]' type='text' id='department' value='" .$row['department']. "'> 
</td> 
<td align='center'> 
<input name='productname[]' type='text' id='productname' value='" .$row['productname']. "'> 
</td> 
<td align='center'> 
<input name='productnum[]' type='text' id='productnum' value='" .$row['productnum']. "'> 
</td> 
<td align='center'> 
<input name='maker[]' type='text' id='maker' value='" .$row['maker']. "'> 
</td> 
<td align='center'> 
<input name='cost[]' type='text' id='cost' value='" .$row['cost']. "'> 
</td> 
<td align='center'> 
<input name='per[]' type='text' id='per' value='" .$row['per']. "'> 
</td> 
<td align='center'> 
<input name='importfee[]' type='text' id='importfee' value='" .$row['importfee']. "'> 
</td> 
<td align='center'> 
<input name='prepcost[]' type='text' id='prepcost' value='" .$row['prepcost']. "'> 
</td> 
<td align='center'> 
<input name='MOQ[]' type='text' id='MOQ' value='" .$row['MOQ']. "'> 
</td> 
<td align='center'> 
<input name='weight[]' type='text' id='weight' value='" .$row['weight']. "'> 
</td> 
<td align='center'> 
<input name='sizeT[]' type='text' id='sizeT' value='" .$row['sizeT']. "'> 
</td> 
<td align='center'> 
<input name='category[]' type='text' id='category' value='" .$row['category']. "'> 
</td> 
<td align='center'> 
<input name='page[]' type='text' id='page' value='" .$row['page']. "'> 
</td> 
<td align='center'> 
<input name='specs[]' type='text' id='specs' value='" .$row['specs']. "'> 
</td> 
<td align='center'> 
<input name='comment[]' type='text' id='comment' value='" .$row['comment']. "'> 
</td> 
<td align='center'> 
<input name='stock[]' type='text' id='stock' value='" .$row['stock']. "'> 
</td> 
</tr>"; 
} 
} else { 
echo "Error: " . $sql . "<br>" . $conn->error; 
} 
echo " 
</table> 
<input type='submit' name='Submit' value='Update'> 
<input type='submit' name='del' value='Delete'> 
</form>"; 



// Check if button name "Submit" is active, do this 
if(isset($_POST['Submit'])){ 
    $department= $_POST['department']; 
    $productname = $_POST['productname']; 
    $productnum = $_POST['productnum']; 
    $maker = $_POST['maker']; 
    $cost = $_POST['cost']; 
    $per = $_POST['per']; 
    $importfee = $_POST['importfee']; 
    $prepcost = $_POST['prepcost']; 
    $MOQ= $_POST['MOQ']; 
    $weight = $_POST['weight']; 
    $sizeT = $_POST['sizeT']; 
    $category = $_POST['category']; 
    $page = $_POST['page']; 
    $specs = $_POST['specs']; 
    $comment = $_POST['comment']; 
    $stock = $_POST['stock'];  
for($i=0;$i<$count;$i++){ 
$sql1 = "UPDATE $tbl_name SET 
department='".$department[$i]."', productname='".$productname[$i]."', productnum='".$productnum[$i]."' 
WHERE id='".$id[$i]."'"; 
$result1 = $conn->query($sql1); 
} 
for($i=0;$i<$count;$i++){ 
$sql1 = "UPDATE $tbl_name SET 
maker='".$maker[$i]."', cost='".$cost[$i]."', per='".$per[$i]."', importfee='".$importfee[$i]."', prepcost='".$prepcost[$i]."' 
WHERE id='".$id[$i]."'"; 
$result1 = $conn->query($sql1); 
} 
for($i=0;$i<$count;$i++){ 
$sql1 = "UPDATE $tbl_name SET 
MOQ='".$MOQ[$i]."', weight='".$weight[$i]."' 
WHERE id='".$id[$i]."'"; 
$result1 = $conn->query($sql1); 
} 
for($i=0;$i<$count;$i++){ 
$sql1 = "UPDATE $tbl_name SET 
sizeT='".$sizeT[$i]."', category='".$category[$i]."', page='".$page[$i]."' 
WHERE id='".$id[$i]."'"; 
$result1 = $conn->query($sql1); 
} 
for($i=0;$i<$count;$i++){ 
$sql1 = "UPDATE $tbl_name SET 
specs='".$specs[$i]."', comment='".$comment[$i]."', stock='".$stock[$i]."' 
WHERE id='".$id[$i]."'"; 
$result1 = $conn->query($sql1); 
} 
echo("<script>location.href = 'MATERIALlist.php';</script>"); 
} 


if (isset($_POST['del'])){ 
    $checkbox = $_POST['checkbox']; 
    $count = count($checkbox); 
    for($i=0;$i<$count;$i++){ 
     if(!empty($checkbox[$i])){ /* CHECK IF CHECKBOX IS CLICKED OR NOT */ 
     $id = mysqli_real_escape_string($conn,$checkbox[$i]); /* ESCAPE STRINGS */ 
     mysqli_query($conn,"DELETE FROM $tbl_name WHERE id = '$id'"); /* EXECUTE QUERY AND USE ' ' (apostrophe) IN YOUR VARIABLE */ 
     } /* END OF IF NOT EMPTY CHECKBOX */ 
    } /* END OF FOR LOOP */ 
    echo("<script>location.href = 'MATERIALlist.php';</script>"); 
} /* END OF ISSET DELETE */ 



if(isset($_POST['Add'])){ 
$sql = "INSERT INTO $tbl_name (department,productname,productnum,maker,cost,per,importfee,prepcost,MOQ,weight,sizeT,category,page,specs,comment,stock) 
VALUES('$_POST[department_add]','$_POST[productname_add]','$_POST[productnum_add]','$_POST[maker_add]','$_POST[cost_add]','$_POST[per_add]','$_POST[importfee_add]','$_POST[prepcost_add]','$_POST[MOQ_add]','$_POST[weight_add]','$_POST[sizeT_add]','$_POST[category_add]','$_POST[page_add]','$_POST[specs_add]','$_POST[comment_add]','$_POST[stock_add]')"; 
if ($conn->query($sql) === TRUE) { 
echo("<script>location.href = 'MATERIALlist.php';</script>"); 
} else { 
echo "Error: " . $sql . "<br>" . $conn->error; 
} 
} 


$conn->close(); 

?> 
</body> 
</html> 

私はそれは私がそれを修正してきたし、今では初回実行時エラーでいっぱいでしたが、私ならば停止します...私のプリペアドステートメント(多分)に機能を提出変更前と同じように私のテーブルにたくさんの行があります。興味深いのは、更新された場合、更新されていないときに出力が全くないというエコーの "Updated {$ stmt-> affected_rows} rows"です。ステートメントが実行されていないように見えますか?

// Check if button name "Submit" is active, do this 
if(isset($_POST['Submit'])){ 
    $department= $_POST['department']; 
    $productname = $_POST['productname']; 
    $productnum = $_POST['productnum']; 
    $maker = $_POST['maker']; 
    $cost = $_POST['cost']; 
    $per = $_POST['per']; 
    $importfee = $_POST['importfee']; 
    $prepcost = $_POST['prepcost']; 
    $MOQ= $_POST['MOQ']; 
    $weight = $_POST['weight']; 
    $sizeT = $_POST['sizeT']; 
    $category = $_POST['category']; 
    $page = $_POST['page']; 
    $specs = $_POST['specs']; 
    $comment = $_POST['comment']; 
    $stock = $_POST['stock']; 

for($i=0;$i<$count;$i++){ 

$sql = "UPDATE $tbl_name SET 
department=?,productname=?,productnum=?,maker=?,cost=?,per=?,importfee=?,prepcost=?,MOQ=?,weight=?,sizeT=?, 
category=?,page=?,specs=?,comment=?,stock=? 
WHERE id='".$id[$i]."'"; 
$stmt = $conn->prepare($sql); 
$stmt->bind_param('ssssssssssssssss',  $department[$i], $productname[$i], $productnum[$i], $maker[$i], $cost[$i] ,$per[$i] ,$importfee[$i], 
$prepcost[$i] ,$MOQ[$i], $weight[$i] ,$sizeT[$i] ,$category[$i] ,$page[$i], $specs[$i], $comment[$i], $stock[$i]); 

$stmt->execute(); 
if ($stmt->errno) { 
    echo "FAILURE!!! " . $stmt->error; 
} 
else echo "Updated {$stmt->affected_rows} rows"; 

} 
$stmt->close(); 
} 
+0

文の制限に問題がある可能性があります。 **反復処理の前に作成されたプリペアドステートメントはこれを軽減し、パラメータバインドと組み合わせるとSQLインジェクションからクエリを安全にします – Phil

+0

問題は、すべてを1ページに入れたことです。基本的な部分でロジックを分離し、jQueryを使ってそれらをajaxでリクエストします。また、ループ内でSQLクエリを実行するとniceではないことを覚えておいてください:) – num8er

+0

@ num8er OPの問題の原因は非常に疑問です – Phil

答えて

0

これはphp.iniの問題でした。私は、同時にすべてを更新しようとしていたので、POSTの上限に達しました:

; How many GET/POST/COOKIE input variables may be accepted 
max_input_vars = 2500 

147行×17列= 2499 POSTのように148行が受け入れられませんでした。制限を増やすことで問題を解決できました。

1

挿入するコミット文はありません。最大挿入数は、挿入レコードサイズと比較したときのパケットサイズに依存しますが、多くの場合挿入後に単純にコミットできます。コミット・ステートメントは、表の挿入または更新の論理グループを実行する必要がある場合に、挿入をロールバックする機能を提供します。

+0

私はStart TransactionとCommitについて聞いたことがありますが、それを使っている例は見当たらないのです。私はそれを読んで、これが助けになるかどうかを調べるつもりです。 – Nama

関連する問題