在SQL语句中使用PHP变量

时间:2012-11-02 17:01:24

标签: php sql

我是PHP和SQL的新手...... 我无法识别我的SQL代码中使用的变量?

这里是完整的代码,我正在尝试填充数据库表,并回答从html页面回答的问题

有什么帮助吗?

<?php

$odbc = mysql_connect ('localhost', 'root', '') or die ("Could not connect to database");
mysql_select_db('Questionaire', $odbc) or die ("can not find database");

$sql;
$quantity = 1;

$id = 222;
$r = 1;
$course = '555';



for ($i = 1; $i < $quantity; $i++)
{   
$answer = $_POST['q'.$r];

if ($answer == 'a')
{
    $sql = "INSERT INTO `questionaire`.`tanswer` (`User`, `QuestionID`, `Answer1`, `Answer2`, `Answer3`, `Answer4`, `Answer5`, `AnswerFreeText`) VALUES (".$id.", ".$i.",       '1', '0', '0',  '0', '0', '')";                         
}

if ($answer == 'b')
{
    $sql = 'INSERT INTO `questionaire`.`tanswer` (`User`, `QuestionID`, `Answer1`, `Answer2`, `Answer3`, `Answer4`, `Answer5`, `AnswerFreeText`) VALUES ('.$id.', '.$i.',               "0", "1", "0",  "0", "0", "")'; 
    echo'<h2> hello </h2>'; 
    $result = mysql_query($sql,$odbc) or die ("can not run query");                 
}

if ($answer == 'c')
{
    $sql = "INSERT INTO `questionaire`.`tanswer` (`User`, `QuestionID`, `Answer1`, `Answer2`, `Answer3`, `Answer4`, `Answer5`, `AnswerFreeText`) VALUES (".$id.", ".$i.",       '0', '0', '1',  '0', '0', '')";     echo $sql;                  
}

if ($answer == 'd')
{
    $sql = "INSERT INTO `questionaire`.`tanswer` (`User`, `QuestionID`, `Answer1`, `Answer2`, `Answer3`, `Answer4`, `Answer5`, `AnswerFreeText`) VALUES (".$id.", ".$i.", '0', '0', '0', '1', '0', '');";                           
}

$r++;

}



?>

3 个答案:

答案 0 :(得分:3)

如果您是PHP和MySQL的新手,您最好尽早学习最佳实践,并养成使用查询参数的习惯。这比使用.将PHP变量连接到SQL要容易得多。

<?php
$pdo = new PDO(...connection parameters...);

$sql = "INSERT INTO `questionaire`.`tanswer` 
    (`User`, `QuestionID`, `Answer1`, `Answer2`, `Answer3`, `Answer4`, `Answer5`, `AnswerFreeText`) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?)";

$stmt = $pdo->prepare($sql) 
    or die(print_r($pdo->errorInfo, true));

$values = array($id, $i, 1, 0, 0, 0, 0, '');

$stmt->execute($values) 
    or die(print_r($stmt->errorInfo, true));

代码更容易,它可以避免SQL injection个漏洞的风险。

您可以使用查询参数代替SQL表达式中的单个文字值。因此,您不能将参数用于表名,列名,值列表或其他语法。只有你在SQL中编写单个字符串或单个数字的地方。

答案 1 :(得分:0)

你应该把所有变量都放在单引号中(试着产生类似:“('1','John','Canada'等等)。为了做到这一点你应该使用类似的东西:< / p>

"... VALUES ('$id', '$i', '0', etc...)"

提示:

双引号表示首先解析文本,这样就可以将变量直接集成到其中。

假设i = 1.那产生:

 "i is: $i" == "i is: 1";

但是,如果你想要使用直接文本而不首先解析它,你可以使用单引号('):

 'i is: $i' == 'i is: $i' 

答案 2 :(得分:0)

这对你来说更简单:

      $query = sprintf("INSERT INTO table " .
               " (id, col1, col2,col3) " .
               " VALUES (NULL, '%s', '%s', '%s');",
               mysql_real_escape_string($val1),
               mysql_real_escape_string($val2),
               mysql_real_escape_string($val3));