2013-04-14 116 views
0

我想一次提交一個完整的信息表,並不能找到答案。向數據庫提交一組信息沒有任何問題,但我需要立刻在1到50之間侮辱相同的值。這裏有一個例子:插入多行到MySQL在一次

我們記錄單圈時間,因此,我們需要能夠填寫的表格上一個Web應用程序,其名稱的負荷,事件時間。因此,我們需要一次添加大量的SQL條目。

我曾嘗試只是複製和粘貼表格信息,但是這會導致一個空白集phpMyAdmin的數據。

下面是代碼:

<?php 


$host = "localhost"; 
$databasename = "pe_results"; 
$databaseusername = "root"; 
$databasepassword = ""; 

$conn = mysql_connect("$host", "$databaseusername", "$databasepassword"); 
mysql_select_db("$databasename", $conn); 

     if (isset($_POST['Name'])) { 
     $Name = $_POST['Name']; 
     } 
     if (isset($_POST['Short'])) { 
     $Short = $_POST['Short']; 
     } 
     if (isset($_POST['Med'])) { 
     $Med = $_POST['Med']; 
     } 
     if (isset($_POST['Long'])) { 
     $Long = $_POST['Long']; 
     } 
     if (isset($_POST['VLong'])) { 
     $VLong = $_POST['VLong']; 
     } 
     if (isset($_POST['Extreme'])) { 
     $Extreme = $_POST['Extreme']; 
     } 
     if (isset($_POST['LJump'])) { 
     $LJump = $_POST['LJump']; 
     } 
     if (isset($_POST['HJump'])) { 
     $HJump = $_POST['HJump']; 
     } 
     if (isset($_POST['Shotputt'])) { 
     $Shotputt = $_POST['Shotputt']; 
     } 
     if (isset($_POST['Discuss'])) { 
     $Discuss = $_POST['Discuss']; 
     } 
     if (isset($_POST['Javelin'])) { 
     $Javelin = $_POST['Javelin']; 
     } 
     if (isset($_POST['Date'])) { 
     $Date = $_POST['Date']; 
     } 
     if (isset($_POST['Year'])) { 
     $Year = $_POST['Year']; 
     } 



      $i = count($Name); 

for ($i=0;$i<10;$i++) { 
$n = $Name[$i]; 
$s = $Short[$i]; 
$me = $Med[$i]; 
$lng = $Long[$i]; 
$slng = $VLong[$i]; 
$ext = $Extreme[$i]; 
$ljump = $LJump[$i]; 
$hjump = $HJump[$i]; 
$shot = $Shotputt[$i]; 
$disc = $Discuss[$i]; 
$jav = $Javelin[$i]; 
$date = $Date[$i]; 
$year = $Year[$i]; 

//and so on with more variable... 

$sql="INSERT INTO results_main (`Name`, `Short`, `Med`, `Long`, `Vlong`, `Extreme`, `LJump`, `HJump`, `Shotputt`, `Discuss`, `Javelin`, `Date`, `Year`) 
      VALUES ('$n', '$s', '$me', '$lng', '$slng', '$ext', '$ljump', '$hjump', '$shot', '$disc', '$jav', '$date', '$year')"; 

} 


    $result = mysql_query($sql) or die(mysql_error());; 
     if($result){ 
echo"<br/>Everythings been saved"; 
echo "<BR>"; 
echo "<a href='index.php'>Back to the main page</a>"; 
} 

else { 

echo $result = mysql_query($sql,$conn) or die (mysql_error()); 
} 

// close connection 
mysql_close($conn); 
?> 

還可以找到以下

<?php 
// Create connection 
$con=mysqli_connect("127.0.0.1","root","","pe_results"); 

// Check connection 
if (mysqli_connect_errno($con)) 
    { 
    echo "Uh oh, tell chris that " . mysqli_connect_error() . "NO DATA WILL BE SAVED"; 
    } 
?> 
    <a href="results.php"><div id="1" >Results</div></a> 
    <a href="record.php"><div id="2">Record</div></a> 
    <a href="overview.php"><div id="3">Overview</div></a> 
    <div id="4">Blank</div> 
    <form name="input_primary" action="process.php" method="post"> 

    <font color="#FFFFFF"><strong>Date:</strong></font><input name="Date" type="date" /> 

    <font color="#FFFFFF"><strong>Year:</strong></font><select name="Year"> 
     <option value="7">Year 7</option> 
     <option value="8">Year 8</option> 
     <option value="9">Year 9</option> 
     <option value="10">Year 10</option> 
     <option value="11">Year 11</option> 
     <option value="12">Year 12</option> 
     <option value="13">Year 13</option> 
     </select> 
     <input type="submit" value="Save results!" name="submit" /> 


<table width="200" border="1px solid black" id="maintab"> 
    <tr> 
    <th scope="col">Name</th> 
    <th scope="col">100m</th> 
    <th scope="col">200m</th> 
    <th scope="col">400m</th> 
    <th scope="col">800m</th> 
    <th scope="col">1500m</th> 
    <th scope="col">Long Jump</th> 
    <th scope="col">High Jump</th> 
    <th scope="col">Shotputt</th> 
    <th scope="col">Discus</th> 
    <th scope="col">Javelin</th> 
    </tr> 
    <tr> 
    <td> 
     <input name="Name" type="text" /> 
    </td> 
    <td> 
     <input name="Short" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Med" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Long" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="VLong" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Extreme" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="LJump" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="HJump" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Shotputt" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Discuss" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Javelin" type="text" size="10px" /> 
    </td> 
    </tr> 
+0

你的意思是,你可以在50個不同的排50倍相同的值? – bestprogrammerintheworld

+0

見[此](http://dev.mysql.com/doc/refman/5.0/en/repeat.html)。 – Kermit

+0

nope,它有點難以解釋,在一個LAN上的網站,否則ID鏈接你。它基本上是這樣一個事件發生後填寫Excel電子表格,然後提交,這樣,就不會有20多名,20餘百米次,20​​餘次200米等等等等有在提交任何錯誤,並將其寫入到數據庫,但是所有字段是空白的。 –

回答

1

HTML如果我明白你的問題,你想要做正確的是什麼名稱以[] 所以

領域<select name="Year">

變爲

<select name="Year[]">

然後你就可以遍歷提交的值,例如:

foreach($_POST['Year'] as $k=>$v){ 
echo $v." - This is the value"; 
echo $k." - This is the key"; 
} 

編輯:

(string)$insert; 
if(is_array($_POST['Year'])){ 
    foreach($_POST['Year'] as $k=>$v){ 
     $insert .= "(".$_POST['Name'][$k].", ".$_POST['Short'][$k].", ".$_POST['Med'][$k].", ".$_POST['Long'][$k].", ".$_POST['VLong'][$k].", ".$_POST['Extreme'][$k].", ".$_POST['LJump'][$k].", ".$_POST['HJump'][$k].", ".$_POST['Shotputt'][$k].", ".$_POST['Discuss'][$k].", ".$_POST['Javelin'][$k].", ".$_POST['Date'][$k].", ".$_POST['Year'][$k]."),"; 
    } 
    $insert = substr_replace($insert ,0,-1); 
}else{ 
    $insert .= "($_POST['Name'], $_POST['Short'], $_POST['Med'], $_POST['Long'], $_POST['VLong'], $_POST['Extreme'], $_POST['LJump'], $_POST['HJump'], $_POST['Shotputt'], $_POST['Discuss'], $_POST['Javelin'], $_POST['Date'], $_POST['Year'])"; 
} 
$sql="INSERT INTO results_main 
(`Name`, `Short`, `Med`, `Long`, `VLong`, `Extreme`, `LJump`, `HJump`, `Shotputt`, `Discuss`, `Javelin`, `Date`, `Year`) 
VALUES 
".$insert; 

這應該做的伎倆將所有內容都變成只有一個查詢,而不是對每行進行多個查詢

+0

不害怕沒有,年份功能絕對正常,問題是一次寫多行 –

+0

這就是我說的,用我的解決方案,你可以有10000000選擇,然後在服務器端你循環的結果。我爲你添加了一個樣本,看看 – Breezer

+0

好吧,你能幫我進一步瞭解我到底在哪裏添加到我的PHP?我可以用「年」替代其他值嗎?還有什麼值的關鍵?是關鍵字的數據庫的SQL數據庫和值我想插入? –

0

添加括號[]到所有人的名字在您的HTML格式的(它是有意義的)。括號[]表示元素被視爲動態數組。

在你HTML的形式,做這樣的事情:

<form name="input_primary" action="process.php" method="post"> 

    <font color="#FFFFFF"><strong>Date:</strong></font><input name="Date" type="date" /> 
    <font color="#FFFFFF"><strong>Year:</strong></font><select name="Year"> 
     <option value="7">Year 7</option> 
     <option value="8">Year 8</option> 
     <option value="9">Year 9</option> 
     <option value="10">Year 10</option> 
     <option value="11">Year 11</option> 
     <option value="12">Year 12</option> 
     <option value="13">Year 13</option> 
     </select> 
     <input type="submit" value="Save results!" name="submit" /> 


<table width="200" border="1px solid black" id="maintab"> 
    <tr> 
    <th scope="col">Name</th> 
    <th scope="col">100m</th> 
    <th scope="col">200m</th> 
    <th scope="col">400m</th> 
    <th scope="col">800m</th> 
    <th scope="col">1500m</th> 
    <th scope="col">Long Jump</th> 
    <th scope="col">High Jump</th> 
    <th scope="col">Shotputt</th> 
    <th scope="col">Discus</th> 
    <th scope="col">Javelin</th> 
    </tr> 
<?php 
//Repeat element inside loop 10 times 
for($i=0;$i<10;$i++) { 
?> 
    <tr> 
    <td> 
     <input name="Name[]" type="text" /> 
    </td> 
    <td> 
     <input name="Short[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Med[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Long[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="VLong[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Extreme[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="LJump[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="HJump[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Shotputt[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Discuss[]" type="text" size="10px" /> 
    </td> 
    <td> 
     <input name="Javelin[]" type="text" size="10px" /> 
    </td> 
    </tr> 
<?php 
} 
?> 
</table> 
</form> 

而在你PHP代碼做這樣的事情:然後

//Create initial query for sql-insert. 
$sql="INSERT INTO results_main (`Name`, `Short`, `Med`, `Long`, `Vlong`, `Extreme`, `LJump`, `HJump`, `Shotputt`, `Discuss`, `Javelin`, `Date`, `Year`) VALUES "; 


$date = $Date; //Do like this if date-element is only occur once (at top) (then no need for brackets) 
$year = $Year; //Do like this if year-element is only occur once (at top) (then no need for brackets) 

$cnt = count($Name);  
for ($i=0;$i<$cnt;$i++) { 
    //Use mysql_escape_string to escape strings (when needed) BEFORE adding to the $sql. 
    $n = $Name[$i]; 
    $s = $Short[$i]; 
    $me = $Med[$i]; 
    $lng = $Long[$i]; 
    $slng = $VLong[$i]; 
    $ext = $Extreme[$i]; 
    $ljump = $LJump[$i]; 
    $hjump = $HJump[$i]; 
    $shot = $Shotputt[$i]; 
    $disc = $Discuss[$i]; 
    $jav = $Javelin[$i]; 

    //Insert each row separated with a comma 
    $sql .= "('$n', '$s', '$me', '$lng', '$slng', '$ext', '$ljump', '$hjump', '$shot', '$disc', '$jav', '$date', '$year'),"; 
} 

$useQuery = substr($sql, 0, -1); //Delete last comma 
$result = mysql_query($useQuery); //Do the actual insert 

當然,閱讀了關於PDO,而不是使用mysql_query等。儘快做到這一點,因爲mysql_ *這樣的功能已被棄用,將來會被刪除。 PDO是一個更好的選擇,因爲它是oop,它更安全,更靈活。從這裏開始... http://www.php.net/manual/en/intro.pdo.php

+0

謝謝,它遲到了我,所以我會明天嘗試這個,讓你知道我是如何得到在 –

+0

不客氣!它在這裏也遲到了。早上大約2點... :-) – bestprogrammerintheworld

+0

'name =「[]」'這個除了其他的東西不會工作,並且這個東西將所有post變量重新應用到另一個var在這種情況下是不必要的,它浪費內存和處理,並且對每一行運行查詢都不用說一個愚蠢的想法,因爲它可以全部運行在一箇中,並且會節省計算機的電量 – Breezer

0

將數據存儲在多個陣列中是不安全的,因爲它很容易出錯並導致錯誤。取而代之的將數據存儲到一個關聯數組是這樣的:

$people = array(); 
$people[] = array('Name' => $name, 'Short' => $short ....); 

上面的代碼建立和數組和內部數組的數組是關聯數組,所以你可以使用下面的語法來獲得的第一人的名字:

$人[0] [ '姓名'];

一切都保持在一起,如果某些值不是爲某些人設定的,它將不會滲透到其他人的記錄中。

我看到你使用POST變量。通過使用json_encode和json_decode,上面的關聯數組可以很容易地通過ajax傳遞(如果這就是你使用的,只是一個選項)。這有助於在通過多種語言傳遞數據結構時保留數據結構。

最後要插入大量記錄,我建議將PDO語句作爲最簡單和最乾淨的方法之一。看看這裏的一個偉大的教程http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

希望這會有所幫助,祝你好運!