2017-09-01 208 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) 

它会检索所有的答案你

请,这是专业的方式。 希望它有助于

尝试给我你的反馈。