无法通过php更新sql

时间:2015-06-02 22:34:48

标签: php mysql sql

$settings = parse_ini_file("settings.ini");

$conn = new mysqli($settings[servername],$settings[username],$settings[password], $settings[dbname]);
$height = $_POST['heightFt'] * 12 + $_POST['heightIn'];
if($conn->connect_error)
{
    die("Connection failed: " . $conn->connect_error);
}
if(isset($_COOKIE['user']))
{
list($currentFName, $currentLName) = explode(",", $_COOKIE['user']);

}
$newFName = $_POST['fName'];
$newLName = $_POST['lName'];
$newAge = $_POST['age'];
$newWeight = $_POST['weight'];
$newHeight = $_POST['height'];
$newSex = $_POST['sex'];
$sql = "update $settings[userTable] set fName = $newFName, lName = $newLName, age = $newAge, weight = $newWeight, height = $newHeight, sex = $newSex where fName = $currentFName and lName = $currentLName";
$retval = mysql_query($sql, $conn);
if(!$retval)
{
    die("Could not update data: " .  print_r($_POST) );
    //die("Could not update data: " . mysql_error());
}
echo "successful update";

这不起作用,我不知道如何排除故障。 使用代码显示 Array ( [fName] => Test [lName] => Testing [age] => 25 [weight] => 199 [sex] => male [heightFt] => 5 [heightIn] => 7 ) Could not update data: 1

//die("Could not update data: " . print_r($_POST) ); die("Could not update data: " . mysql_error());

显示

Could not update data:

有没有php显示错误的地方。通常当我的代码出现问题时,我只是得到一个白色屏幕,并且必须通过Failed to load resource: the server responded with a status of 500 (Internal Server Error)

的试错来找出问题

1 个答案:

答案 0 :(得分:3)

你正在混合mysqli和mysql接口调用。那工作。

我们看到正在创建一个mysqli连接......

$conn = new mysqli(

但我们看到调用mysql_接口函数。

$retval = mysql_query(

不要那样做。这不行。使用 mysqli_ 功能。

所以,先解决这个问题。

对于调试SQL,在将其提交到数据库之前回显$sql。 (确保您发送的字符串是您要执行的SQL语句。)

此外,合并潜在的不安全值(例如来自$ _GET或$ _POST的变量值)会导致 SQL Injection 漏洞。必须正确转义包含在SQL语句文本中的值。见mysqli_real_escape_string。但这并不足以保证代码仍然不易受SQL注入攻击。

更好的模式是使用预备语句绑定占位符

这不对。

如果$newFName Fred $newLName Flintstone

然后这个:

$sql = "update $settings[userTable] set fName = $newFName, lName = $newLName, ...";

或者你可能真的需要这样做:

$sql = "update " . $settings[userTable] . " set fName = $newFName, lName = $newLName, ...";

评估为

 update mytable set fName = Fred, lName = Flintstone, ...

MySQL会对此犹豫不决,因为字符串文字应该用单引号括起来:

 update mytable set fName = 'Fred', lName = 'Flintstone', ...
                            ^    ^          ^          ^

如果$newLName O'Reilly ,那么MySQL将会犹豫不决,他会看到字符串文字'O',后面跟着MySQL不理解...... < / p>

 update mytable set fName = 'Fred', lName = 'O'Reilly', ...
                                               ^^^^^^ 

为了让它正确运行,我们需要转义该值内的单引号与另一个单引号,所以我们的SQL语句如下所示:

 update mytable set fName = 'Fred', lName = 'O''Reilly', ...
                                              ^^

字符串文字中的两个单引号被(由MySQL)解释为单引号。将存储在列中的值(假设语句当然成功)将是我们想要的: O'Reilly

你可以通过转义值来解决问题,但是更好的模式是使用绑定占位符准备语句...

 $sql = "update mytable set fName= ? ,lName = ?, ... ";

 $stmt = $dbh->prepare($sql);
 $stmt->bind_param("ss",$newFName,$newLName);
 $stmt->execute();

参考:http://php.net/manual/en/mysqli-stmt.bind-param.php