2016-11-05 116 views
1

我的表类有这些列:存储数据库值到变量

 
idcategory 
categorySubject 
users_idusers 

我有一个简单的单选按钮和文本框的形式。 我有类别全选语句,并需要获得idcategory存储到一个变量($ getCatId),所以我可以用这个语句:

$sql="INSERT INTO topic(subject, topicDate, users_idusers,  category_idcategory, category_users_idusers) VALUES('($_POST[topic])', '$date', '$_SESSION[userid]', '$getCatId', '$_SESSION[userid]');"; 

是什么,以获得最佳的方式和存储类别ID?

if($_SERVER['REQUEST_METHOD'] != 'POST') //show form if not posted 
    { 

     $sql = "SELECT * FROM category;"; 

    $result = mysqli_query($conn,$sql); 

     ?> 
    <form method="post" action="createTopic.php"> 
     Choose a category: 
     </br> 
     </br> 

     <?php 
     while ($row = mysqli_fetch_assoc($result)) { 
      echo "<div class= 'choice'><input type='radio' name='category' value='". $row['idcategory'] . "'>" . $row['categorySubject'] ."</div></br>"; 

     } 

       echo 'Topic: <input type="text" name="topic" minlength="3" required> 
      </br></br> 
      <input type="submit" value="Add Topic" required> 
      </form>'; 

      } 


    if ($_POST){ 
     if(!isset($_SESSION['signedIn']) && $_SESSION['signedIn'] == false) 
{ 

    echo 'You must be signed in to contribute'; 
} 
     else{ 
     $sql="INSERT INTO topic(subject, topicDate, users_idusers, category_idcategory, category_users_idusers) VALUES('($_POST[topic])', '$date', '$_SESSION[userid]', '$getCatId', '$_SESSION[userid]');"; 

      $result = mysqli_query($conn,$sql); 
      echo "Added!"; 
+1

** WARNING **:当使用'mysqli'你应该使用[参数化查询(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **绝不**将'$ _POST'或'$ _GET'数据直接放入查询中,如果有人试图利用您的错误,这会非常有害。 – tadman

回答

0

如果我没有理解这个问题,你有你$getCatId$_POST['category'](类别的ID),你的情况(发送表单后)

+0

是的,在按下提交按钮之后,用户从来自数据库的单选按钮中进行选择。我不知道它是否重要,或者我在哪里放置代码,但我已经有一个查询。我不确定是否可以在同一部分放置另一个 – Mei

0

你应该做的第一件事是保护自己SQL injection通过参数化您的查询Bobby Tables来拜访您。

bobby tables

你也可以考虑使用PDO,因为我已经证明如下因为它是一个统一的API是有很多不同的数据库管理系统的工作原理,所以这会导致你奇妙移植的代码。 Here's an annotated working example on Github

<?php 

// returns an intance of PDO 
// https://github.com/jpuck/qdbp 
$pdo = require __DIR__.'/mei_DV59j8_A.pdo.php'; 

// dummy signin 
session_start(); 
$_SESSION['signedIn'] = true; 
$_SESSION['userid'] = 42; 

//show form if not posted 
if($_SERVER['REQUEST_METHOD'] != 'POST'){ 

    $sql = "SELECT * FROM category;"; 

    // run query 
    $result = $pdo->query($sql); 

    ?> 

    <form method="post" action="createTopic.php"> 
    Choose a category: 
    </br> 
    </br> 

    <?php 
    // get results 
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
     echo " 
      <div class= 'choice'> 
       <input type='radio' name='category' value='$row[idcategory]'/> 
       $row[categorySubject] 
      </div> 
      </br> 
     "; 
    } 

    echo ' 
     Topic: <input type="text" name="topic" minlength="3" required> 
     </br></br> 
     <input type="submit" value="Add Topic" required> 
    </form> 
    '; 

} 


if ($_POST){ 
    if(!isset($_SESSION['signedIn']) && $_SESSION['signedIn'] == false){ 
     echo 'You must be signed in to contribute'; 
    } else { 
     // simulate your date input 
     $date = date("Y-m-d"); 

     // bind parameters 
     $sql = " 
      INSERT INTO topic (
       subject, topicDate, users_idusers, category_idcategory, category_users_idusers 
      ) VALUES(
       :subject, :topicDate, :users_idusers, :category_idcategory, :category_users_idusers 
      ); 
     "; 

     // prepare and execute 
     $statement = $pdo->prepare($sql); 
     $statement->execute([ 
      'subject' => "($_POST[topic])", 
      'topicDate' => $date, 
      'users_idusers' => $_SESSION['userid'], 
      // to answer your question, here's your variable 
      'category_idcategory' => $_POST['category'], 
      'category_users_idusers' => $_SESSION['userid'], 
     ]); 

     echo "Added!"; 
    } 
}