$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)
答案 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();