2017-09-01 15 views
-2

私はhtmlサーベイをしており、答えはPHPを介してデータベースにロードされる変数に格納されています。PHP文字列可変制限

<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のようなルックスを埋めることができる方法の質問(テーブルの一部)でありますしたがって、htmlのtextarea name = "tag1" ...は、PHPのtag1というデータベース列にユーザーの回答を読み込みます。

PHP INSERTコード(tag1、tag2、tag3 ...など)の括弧には、文字数に制限があるため、あまりにも多くの項目を追加できないという問題があります。

私は含めるべき質問の数に問題があります。そして、2つの別々のコマンドを作成すると、データベース内の2つの異なる行にロードされ、混乱します。 1人の回答が1つの行に表示されます。 (phpmyadmin)

どうすれば解決できますか?私は何を変えるべきですか?

+4

[Little Bobby](http://bobby-tables.com/)によると*** [あなたのスクリプトはSQLインジェクション攻撃の危険にさらされています。](http://stackoverflow.com/questions/60174/how- php)*** MySQLi(http://php.net)の[prepared](http://en.wikipedia.org/wiki/Prepared_statement)のステートメントについて学びます。 /manual/ja/mysqli.quickstart.prepared-statements.php)。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+1

通常、テーブルを正規化する必要があります。ユーザー(ユーザー保持)テーブルに質問(質問保持)テーブルと接続テーブルuser_question(ユーザーの質問を保持) –

+0

Little Bobbyはこのような質問については言及しませんでした。コミュニティから有益な提案をしたい場合は、テーブルを作成するために使用されるSQLステートメントも含めてください。それができなければ、人々は目隠しをしたダーツを撃ちます。 – YvesLeBorg

答えて

3

質問が追加された場合にデータベース構造を更新する必要があるため、これはまずデータベースを作成するための優れた方法ではありません。

とにかく、どのユーザーからの回答であるかを追跡できるように、ユーザーにIDを与える必要があります。その後、IDをsurveyテーブルに追加することができます。ユーザーが別の質問に回答する場合は、単に回答を更新することができます。

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

テーブル構造を改訂すべきだと私は思っていますが、含まれる;結局のところ、ほとんどのアンケートは匿名です –

+0

@ウィリアムペロンほとんどの調査は匿名ですが、どのユーザーが何の質問を回答したかを特定する必要があります –

+0

私はユーザーが登録する必要はありませんでしたが、別のページに – Jerodev

0

Jerodevの回答は本質的に正しいです。しかし、レシピはわずかに不完全です。

クエリには長さの制限があるように見えるため、クエリを複数のクエリに分割する必要があります(制限を増やすことを除いて、それを回避する方法は実際にはありません)。

テーブルには一意のID(たとえばプライマリキー)が必要です。最初のクエリで設定する必要があります(INSERT、おそらくauto_incrementカラムを使用するか、他の場所から適切なIDをコピーします)。

auto_increment列の場合は、挿入された行のIDをmysqli_insert_idで取得します。それ以外の場合は、すでにそれが必要です。他のすべての照会は、IDをバインドするWHERE節を使用するUPDATE照会でなければなりません。 PHPで

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

YOU ABSOLUTELY DO WANT TO PREPARE QUERIES!):AUTO_INCREMENT PRIMARY_KEY列と

$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); 

$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

次の2つのテーブル、アンケートの回答のために他のいずれかのいずれかが必要とリンク回答のある調査表。

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); 
     } 

、それはあなた

ためのすべての答えを取得しますSURVEY

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

ON解答のBASEを取得するために、これはしてくださいプロの方法。 助けてくれることを願っています。

私はフィードバックをお願いします。

関連する問題