2017-09-01 243 views
-2

我有一個html調查,答案存儲在應通過PHP加載到數據庫中的變量。PHP字符串變量限制

例如,這是怎樣的問題(表的一部分),您可以填寫看起來像HTML:

<td style="padding-top: 10px;" colspan="9"> Question1: 
     <p style="text-align:left;"><textarea name="tag1" cols="80" rows="6" 
style="border: 1px solid #D0D0D0;"></textarea></p> 
     </td> 

<td style="padding-top: 10px;" colspan="9"> Question2: 
     <p style="text-align:left;"><textarea name="tag2" cols="80" rows="6" 
style="border: 1px solid #D0D0D0;"></textarea></p> 
     </td>' 

的PHP代碼:

$conn = mysqli_connect($servername, $username, $password, $dbname); 

if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 

$tag1 = $_POST["tag1"]; 
$tag2 = $_POST["tag2"]; 

$sql = "INSERT INTO survey (tag1, tag2) 
VALUES ('$tag1','$tag2')"; 

if (mysqli_query($conn, $sql)) { 
    echo ""; 
    } else { 
    echo "Error: " . $sql . "<br>" . mysqli_error($conn); 
    }' 

因此,html中的textarea name =「tag1」...將PHP用戶的答案加載到名爲tag1的數據庫列。

問題是我不能在PHP中插入代碼太多的項目添加到支架上(如標籤1,標籤2,標籤3 ...),因爲角色是有限的。

這是一個問題,由於我應該包括的問題的數量。如果我創建兩個單獨的命令,它將加載到數據庫中的兩個不同的行,看起來很混亂。一個人的答案應該出現在一行中。 (在phpMyAdmin)

我該怎麼解決呢?我應該改變什麼?

+4

[小博](http://bobby-tables.com/)說***腳本是在對SQL注入攻擊的風險。(http://stackoverflow.com/questions/60174/how- ***)瞭解[MySQLi](http://php.net)的[prepared](http://en.wikipedia.org/wiki/Prepared_statement)語句/manual/en/mysqli.quickstart.prepared-statements.php)。即使[轉義字符串](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)是不安全的! –

+1

通常你應該正常化你的表...有一個用戶(持有用戶)表中的問題(持有題)表和連接表user_question(保存用戶的問題) –

+0

小博沒有提到這樣下去,你應該問題還包括用於創建表的SQL語句...如果你想從社區獲得任何有用的建議。否則,人們會被矇住眼睛的飛鏢射擊。 – YvesLeBorg

回答

3

對於初學者來說,這是不是讓你的數據庫,因爲你將不得不如果問題補充更新您的數據庫結構的好方法。

無論如何,你應該給用戶一個ID,這樣你就可以追蹤來自哪個用戶什麼樣的答案。之後,您可以將該ID添加到survey表中,如果用戶回答其他問題,則可以簡單地更新答案。

UPDATE survey SET `tag2`='answer' WHERE `user_id` = 0; 
+1

雖然我同意表結構應予以修訂,我不認爲這是一個絕對的客觀真理,用戶ID應該是包括在內;畢竟,大多數調查是匿名的 –

+0

@William佩隆大多數調查是匿名的是,但你需要確定哪些用戶已answerd什麼問題 –

+0

我並不意味着用戶要註冊,但也許在會話中添加一個ID來標識相同的用戶在不同的頁面上。 – Jerodev

0

Jerodev的答案基本上是正確的。然而,配方略有不完整。

由於查詢似乎有長度限制,你必須把它(從增加限制不是一個真正的周圍的方式,除了)拆分成多個查詢。

你的表必須有某種唯一的ID(例如主鍵),它必須由第一個查詢設置 - 一個INSERT - 可能通過auto_increment列,或者你從其他地方複製一個適當的ID。

如果它是一個AUTO_INCREMENT列,您可以通過mysqli_insert_id得到插入行的ID,否則,你應該已經擁有它。所有其他查詢都必須是UPDATE查詢,這些查詢使用綁定該ID的WHERE子句。

-- first query 
INSERT INTO survey (id, tag1, tag2) VALUES (42, 'tag1', 'tag2'); 
-- other queries 
UPDATE survey SET tag3='tag3', tag4='tag4' WHERE id=42 

在PHP(YOU ABSOLUTELY DO WANT TO PREPARE QUERIES!):

$stmt = mysqli_prepare($conn, 'INSERT INTO survey (id, tag1, tag2) VALUES (?,?,?)'); 
$stmt->bind_param('iss', $id, $tag1, $tag2); 
$stmt->execute(); 
$stmt2 = mysqli_prepare($conn, 'UPDATE survey SET tag3=?, tag4=? WHERE id=?'); 
$stmt2->bind_param('ssi', $tag3, $tag4, $id); 

與AUTO_INCREMENT primary_key柱:

$stmt = mysqli_prepare($conn, 'INSERT INTO survey (tag1, tag2) VALUES (?,?)'); // ! 
$stmt->bind_param('ss', $tag1, $tag2); // ! <-- no id anymore 
$stmt->execute(); 
$id = $stmt->insert_id; // <--- this is new 
$stmt2 = mysqli_prepare($conn, 'UPDATE survey SET tag3=?, tag4=? WHERE id=?'); 
$stmt2->bind_param('ssi', $tag3, $tag4, $id); 
0

你需要兩個表,一個用於測量和另外一個答案和鏈接調查表與答案。

1數據庫結構

調查表

  • ID

  • 調查名稱

  • 日期

    個回答表

  • ID
  • survey_id
  • 問題
  • 回答
  • 日期

    HTML

    <table> 
        <td style="padding-top: 10px;" colspan="9" name="question[]" value ="Question1"> Question1: 
          <p style="text-align:left;"><textarea name="tag[]" cols="80" rows="6" 
        style="border: 1px solid #D0D0D0;"></textarea></p> 
          </td> 
    
    
    <td style="padding-top: 10px;" colspan="9" name="question[]" value ="Question12"> Question2: 
          <p style="text-align:left;"><textarea name="tag[]" cols="80" rows="6" 
        style="border: 1px solid #D0D0D0;"></textarea></p> 
          </td> 
    

PHP

$conn = mysqli_connect($servername, $username, $password, $dbname); 

if (!$conn) { 
    die("Connection failed: " . mysqli_connect_error()); 
} 
    // assuming the survey id = 10 
     survey_id = 10; 
    date = date("Y-m-d"); 
    $question = mysqli_real_escape_string($_POST["question"]); 
    $answers = mysqli_real_escape_string($_POST["tag"]); 


    foreach(answers as $key => $val){ 
     $question[$key]; 
     $answers[$key]; 

    $sql = "INSERT INTO Answers (survey_id, question, answer, date) 
    VALUES ('$survey_id ','$question','$answers','$date')"; 
    } 
    if (mysqli_query($conn, $sql)) { 
     echo ""; 
     } else { 
     echo "Error: " . $sql . "<br>" . mysqli_error($conn); 
     } 

並獲取解答BASE ON調查

$sql = "SELECT * FROM ANSWERS WHERE survey_id = 10 ORDER BY id ASC" 
    mysqli_query($conn, $sql) 

它會檢索所有的答案你

請,這是專業的方式。 希望它有助於

嘗試給我你的反饋。