iT邦幫忙

0

[php] 迴圈寫入資料庫

php

各位大大好:

想做每個作品評分,要怎麼把每個作品的號碼跟3個評分寫在同一列資料庫,謝謝

echo "<form action='r_wr.php' method='post'>";
$i=1;
//echo "<thead><tr><td>作品編號</td><td>作品名稱</td><td width='40%'>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr></thead>"; 
$result=$conn->query($sql);

foreach($result->fetchAll() as $row)
{
echo '<table border=3 id="electable" width="80%" height="100%">';
echo"<tbody><tr>";
echo "<td width='15%'align='center' bgcolor='#cccccc'>題目</td><td width='40%'>".$row['name']."</td><td width='5%'align='center'bgcolor='#cccccc'>編號</td><td  colspan='4'width='15%' align='center'><input type='hidden' name='num$i' value='$i'>".$row['識別碼']."</td>";
echo"</tr>";

echo "<tr><td width='15%' align='center' bgcolor='#cccccc' >組員</td><td  colspan='6'>".$row['author']."</td></tr>";

echo"<tr><td align='center' bgcolor='#cccccc'>項次</td><td bgcolor='#cccccc'>評分項目</td><td  align='center' bgcolor='#cccccc'>5</td><td  align='center'  bgcolor='#cccccc'>4</td><td  align='center'  bgcolor='#cccccc'>3</td><td  align='center' bgcolor='#cccccc'>2</td><td  align='center'  bgcolor='#cccccc'>1</td></tr>";

echo"<tr><td align='center'>1</td><td>目的與動機</td><td align='center'><input type='radio' name='purpose$i' value='5'></td><td align='center'><input type='radio' name='purpose$i' value='4'></td><td align='center'><input type='radio' name='purpose$i' value='3'></td><td align='center'><input type='radio' name='purpose$i' value='2'></td><td align='center'><input type='radio' name='purpose$i' value='1'></td></tr>";

echo"<tr><td align='center'>2</td><td>產品構想</td><td align='center'><input type='radio' name='conception$i' value='5'></td><td align='center'><input type='radio' name='conception$i' value='4'></td><td align='center'><input type='radio' name='conception$i' value='3'></td><td align='center'><input type='radio' name='conception$i' value='2'></td><td align='center'><input type='radio' name='conception$i' value='1'></td></tr>";

echo"<tr><td align='center'>3</td><td>技術原理</td><td align='center'><input type='radio' name='techonology$i' value='5'></td><td align='center'><input type='radio' name='techonology$i' value='4'></td><td align='center'><input type='radio' name='techonology$i' value='3'></td><td align='center'><input type='radio' name='techonology$i' value='2'></td><td align='center'><input type='radio' name='techonology$i' value='1'></td></tr>";

echo"</tbody>";
echo "</table>";
echo"<br/>";
$i++;
}
echo "<input type='submit' value='確認送出' />";
echo "</form>";
r_wr.php
請問寫回資料庫要怎麼分排列1怎麼寫回第一列
$post_['num1']=1,
$post_['$purpose1']=5,
$post_['$conception1']=5,
$post_['$techonology1']=5
請問寫回資料庫要怎麼分排列2怎麼寫回第二列
$post_['num2']=1,
$post_['$purpose2']=4,
$post_['$conception2']=5,
$post_['$techonology2']=4
我寫這樣好像變成每個值就是一個迴圈
foreach($_POST as $key => $value){
echo($key."=".$value."<br>");
if(substr($key, 0, 2) == 'num'){
$projectnum=$value;
echo($key."=". $projectnum."<br>");
}
else if  (substr($key, 0, 6) == 'purpose') {
$purpose=$value;
echo($key."=".$purpose."<br>");
}
else if (substr($key, 0, 9) == 'conception'){
$conception=$value;
echo($key."=".$conception."<br>");
}
else if(substr($key, 0, 10) == 'techonology' ){
$techonology=$value;
echo($key."=".$techonology."<br>");
}
       
$sql6="INSERT INTO  score(projectnum,purpose,conception,techonology) values (:projectnum,:purpose,:conception,:techonology)"; //單冒號宣布冒號裡的字串 雙冒號是分析這個冒號裡的語法
       $sql8 =$conn->prepare($sql6);
       $sql8->execute(array(
        "projectnum" =>$projectnum,
       "purpose"=>$purpose,
       "conception"=>$conception,
       "techonology"=>$techonology               
        ));

dragonH iT邦研究生 4 級 ‧ 2019-06-18 11:17:36 檢舉
....
我看你php也學了好長的一段時間了。
為什麼程式碼結構還是沒有進步呢?
你這樣不行喔!請加油。
mayyola iT邦新手 2 級 ‧ 2019-06-18 15:55:50 檢舉
可樂快跑:好的@_@我會繼續修正Orz..
0
ernesthwung
iT邦新手 5 級 ‧ 2019-06-19 18:04:20
最佳解答

主頁模擬您的寫法,忽略sql資料庫
index.php

<?php

    for($i=1; $i<=5; $i++){

    echo "
    <table>
        <tr>
            <td>組員</td>
            <td><input type='text' name='author[]' value='我是組員$i'></td>
            <td>編號</td>
            <td colspan='4'><input type='text' name='num[]' value='$i'></td>

        </tr>
        <tr>
            <td>題目</td>
            <td colspan='6'><input type='text' name='title[]' value='我是題目$i'></td>

        </tr>
        <tr>
            <td>項次</td>
            <td>評分項目</td>
            <td>5</td>
            <td>4</td>
            <td>3</td>
            <td>2</td>
            <td>1</td>
        </tr>
        <tr>
            <td>1</td>
            <td>目的與動機</td>
            <td><input type='radio' name='purpose".$i."[]' value='5'></td>
            <td><input type='radio' name='purpose".$i."[]' value='4'></td>
            <td><input type='radio' name='purpose".$i."[]' value='3'></td>
            <td><input type='radio' name='purpose".$i."[]' value='2'></td>
            <td><input type='radio' name='purpose".$i."[]' value='1'></td>
            
        </tr>
        <tr>
            <td>2</td>
            <td>產品構想</td>
            <td><input type='radio' name='idea".$i."[]' value='5'></td>
            <td><input type='radio' name='idea".$i."[]' value='4'></td>
            <td><input type='radio' name='idea".$i."[]' value='3'></td>
            <td><input type='radio' name='idea".$i."[]' value='2'></td>
            <td><input type='radio' name='idea".$i."[]' value='1'></td>
        </tr>
        <tr>
            <td>3</td>
            <td>技術原理</td>
            <td><input type='radio' name='tec".$i."[]' value='5'></td>
            <td><input type='radio' name='tec".$i."[]' value='4'></td>
            <td><input type='radio' name='tec".$i."[]' value='3'></td>
            <td><input type='radio' name='tec".$i."[]' value='2'></td>
            <td><input type='radio' name='tec".$i."[]' value='1'></td>
        </tr>
    </table>";
}
    ?>
    <button type="submit">確認</button>
</form>

接收頁
post.php

 <?php

$author = $_POST['author'];
$title = $_POST['author'];


for($i=0;$i<sizeof($author);$i++){
    $purpose = $_POST['purpose'.($i+1)];
    $idea = $_POST['idea'.($i+1)];
    $tec = $_POST['tec'.($i+1)];
    echo "作者".$author[$i]." + 題目".$title[$i]." + 分數一:".$purpose[0]." + 分數二:".$idea[0]." + 分數三:".$tec[0]."<br>";
    
}


?>

同一個作者與題目所評選之分數就會在同一列!
不知這個回答是否是你所需要的?

mayyola iT邦新手 2 級 ‧ 2019-06-19 18:45:19 檢舉

er大您好:沒錯這是我想要的,想詢問為什麼$tec[0]是用0呢
謝謝你

你可以先用

echo $purpose...

等三個變數,網頁的回應會顯示這三個都是陣列。不會顯示分數
然後你再用

echo var_dump($purpose);

得到的網頁回應如下:

array(1) { [0]=> string(1) "3" } array(1) { [0]=> string(1) "3" } array(1) { [0]=> string(1) "3" } array(1) { [0]=> string(1) "3" } array(1) { [0]=> string(1) "3" }

每一組的陣列都是[0]

1
浩瀚星空
iT邦大師 1 級 ‧ 2019-06-18 11:31:33

先學好form的特性吧。

input的radio類型,請用如下的方式處理

<input type='radio' name='conception$i[]' value='5'>

之後再用FOREACH做整合出來就行了。

你用這樣子要寫是一件很麻煩的事。而且你因該post值也會不正確才對。
先學好form。

看更多先前的回應...收起先前的回應...
mayyola iT邦新手 2 級 ‧ 2019-06-18 11:53:09 檢舉

浩瀚大大您好:我加了以後會變這樣@ @
Parse error: syntax error, unexpected ']', expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)

我猜您是想conception[] ($i是變數),但多加[]每個作品的項次1只能選一個作品點選,所以才用變數處理..

https://ithelp.ithome.com.tw/upload/images/20190618/200970576OD5MuHagy.jpg

['$num'],['$purpose'],['$conception'],['$techonology']

你這個是陣列吧 你存回資料庫的欄位名稱不一樣 當然就被資料庫認為是新的欄位了

mayyola iT邦新手 2 級 ‧ 2019-06-18 12:07:43 檢舉

是的,因為都同一個名稱radio點的時候會有問題

淺水員 iT邦新手 3 級 ‧ 2019-06-18 12:17:10 檢舉

其實我不懂這邊為什麼要用

<input type='radio' name='conception$i[]' value='5'>

這樣 $_POST[conception$i] 如果有值
不是只是一個只有一個元素的陣列嗎?
那為何不直接用原來的寫法就好?

mayyola iT邦新手 2 級 ‧ 2019-06-18 12:29:02 檢舉

頁面顯示會是我想要的結果,但是寫回資料庫,無法寫在同一列,會一直產生新的一筆資料(有點難解釋..)

$post_['num1']=1,
$post_['$purpose1']=5,
$post_['$conception1']=5,
$post_['$techonology1']=5

https://ithelp.ithome.com.tw/upload/images/20190618/20097057ahBNQGCFPY.png

$sql8->execute(array(":projectnum" =>$projectnum,":purpose"=>$purpose,":conception"=>$conception,":techonology"=>$techonology));

這個不用加冒號嗎?

mayyola iT邦新手 2 級 ‧ 2019-06-18 15:55:00 檢舉

剛剛有把資料慢慢拆解成我要的,但是總覺得有更簡便的方法..
望各位不吝指教
https://ithelp.ithome.com.tw/upload/images/20190618/20097057F6DXsHF2xC.png
https://ithelp.ithome.com.tw/upload/images/20190618/20097057XN8WP13sSl.png

foreach ($_POST as $key => $value){     
$menu_category[] = $value;             
  }
$block=array_chunk($menu_category,4);
 foreach ($block as $key => $row) { 
          $projectnum=$row[0];
          $purpose=$row[1];
          $conception=$row[2];
          $techonology=$row[3];           
          $sql6="INSERT INTO  score(projectnum,purpose,conception,techonology) values (:projectnum,:purpose,:conception,:techonology)"; 
       $sql8 =$conn->prepare($sql6);
       $sql8->execute(array(
         "projectnum" =>$projectnum,
       "purpose"=>$purpose,
       "conception"=>$conception,
       "techonology"=>$techonology              
        ));                             
      }
luhoe iT邦新手 5 級 ‧ 2019-06-19 15:47:59 檢舉

conception$i[]

為什麼 不改成
conception[$i]
這樣送出的時候會直接轉成陣列 不是比較好操做嗎

Form是不接受[]中間有值的。

luhoe iT邦新手 5 級 ‧ 2019-06-19 20:08:59 檢舉
  <form action="">
    <input type="text" value="1" name="text[]">
    <input type="text" value="2" name="text[]">
    <input type="text" value="3" name="test[5]">
    <input type="text" value="4" name="test[6]">
    <button>send</button>
  </form>

疑 我剛剛測試 結果
https://ithelp.ithome.com.tw/upload/images/20190619/201122119IhH1yd5PZ.png

可以加入唷

你送去php的post查看試試吧。看還有沒有key值存在

0
淺水員
iT邦新手 3 級 ‧ 2019-06-18 14:38:00

回一下取值的部分
原先的做法是

foreach($_POST as $key => $value) {
    //依據 $key ,把 $value 設定給對應參數
}

這邊可能會因為 $key 順序的問題得不到想要的結果

下面是 r_wr.php 關於取值的部分提供參考
(SQL部分就先略過了)

<?php
$nameArray=['purpose', 'conception', 'techonology'];
$incomplete=[]; //儲存沒有填寫完成的 index
$data=[]; //儲存結果

for($i=1; isset($_POST["num$i"]); ++$i) {
    $tmp=[];
    $complete=true;
    foreach($nameArray as $name) {
        if(!isset($_POST[$name.$i])) {
            $incomplete[]=$i;
            $complete=false;
            break;
        }
        $tmp[$name]=$_POST[$name.$i];
    }
    if(!$complete) {
        continue;
    }
    $data[$_POST["num$i"]]=$tmp;
}

if(count($incomplete) > 0) { 
    exit('有欄位尚未填寫');
}

echo "<h3>取得資料</h3>";
echo "<pre>".print_r($data, true)."</pre>";
1
dragonH
iT邦研究生 4 級 ‧ 2019-06-18 15:33:26

要不要考慮在前端用 js 處理後

以 json 的格式傳到後端呢?

然後你的回覆

怎麼讓我感覺你想要問的是 update

不是就忽略掉sql語句那部分

前端

<?php
  echo "<form action='r_wr.php' method='post' id = 'myForm'>";
  ...//中間都沒動
  echo "</form>";
?>
<script>
  const myForm = document.getElementById('myForm');
  myForm.addEventListener('submit', (e) => {
    e.preventDefault();
    const myData = [];
    for (let i = 1; i <= <?php echo count($datas)?>; i += 1) {
      const tempData = {};
      const projectNum = document.getElementsByName(`num${i}`)[0].value;
      const purposeScore = [...document.getElementsByName(`purpose${i}`)].filter(radio => radio.checked)[0].value;
      const conceptionScore = [...document.getElementsByName(`conception${i}`)].filter(radio => radio.checked)[0].value;
      const techonologyScore = [...document.getElementsByName(`techonology${i}`)].filter(radio => radio.checked)[0].value;
      myData.push({ projectNum, purposeScore, conceptionScore, techonologyScore});
    }
    /*
    傳到後端的資料長這樣
    [
      {
        "projectNum":"1",
        "purposeScore":"5",
        "conceptionScore":"4",
        "techonologyScore":"3"
      },
      {
        "projectNum":"2",
        "purposeScore":"3",
        "conceptionScore":"2",
        "techonologyScore":"1"
      }
    ]
    */
    const myformData = new FormData();
    myformData.append('data', JSON.stringify(myData));
    // 以下可用jquery之類取代
    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'r_wr.php', true);
    xhr.send(myformData);
  });
</script>

後端

<?php
  $conn = new PDO('mysql:host=localhost;dbname=myDB;charset=utf8', 'root', '');
  $mydata = json_decode($_POST['data'], true);
  foreach ($mydata as $key => $value) {
    $projectnum = $mydata[$key]['projectNum'];
    $purpose = $mydata[$key]['purposeScore'];
    $conception = $mydata[$key]['conceptionScore'];
    $techonology = $mydata[$key]['techonologyScore'];
    $sql6="UPDATE `score` SET `purpose` = ?, `conception` = ?, `techonology` = ? WHERE projectnum = ?";
    $sql8 =$conn->prepare($sql6);
    $sql8->execute(array(
      $purpose, $conception, $techonology, $projectnum
    )); 
  }
?>

大概是這樣

可能有些地方沒寫得很好

請見諒/images/emoticon/emoticon50.gif

0
maxmas
iT邦新手 4 級 ‧ 2019-06-19 09:22:25

如果你要在一個頁面上同時出現二個以上表單讓USER填寫
表單的欄位一開始就要用陣列的概念處理
例如

<input type="text" name="title[]" value="">
<input type='radio' name='techonology[]' value='4'>
<input type='radio' name='techonology[]' value='3'>
<input type='radio' name='techonology[]' value='2'>
<input type='radio' name='techonology[]' value='1'>

後端你接收到時,你收到的每個欄目就是一個陣列,每個欄目資料由0開始
title[0]
title[1]
.......

mayyola iT邦新手 2 級 ‧ 2019-06-19 09:46:24 檢舉

這樣不行,如果您上面這個變成迴圈,假設有兩group程式碼一樣,例如不能同時點兩個4,只能選1個

dragonH iT邦研究生 4 級 ‧ 2019-06-19 10:06:11 檢舉

要改成

echo "<input type='radio' name='techonology".$i."[]' value='1'>";

不然整頁只會有一種分數

其實在這就算不用陣列

最後也只會將有值的傳到後端

不過習慣上還是常用陣列就是

luhoe iT邦新手 5 級 ‧ 2019-06-19 16:13:24 檢舉
echo "<input type='radio' name='techonology[{$i}]' value='1'>";

其實這樣也是可以的

我要發表回答

立即登入回答