Can';t通过php更新sql

Can';t通过php更新sql,php,mysql,sql,Php,Mysql,Sql,这不起作用,我不知道如何排除故障。 代码如图所示 Array([fName]=>Test[lName]=>Testing[age]=>25[weight]=>199[sex]=>male[heightFt]=>5[heightIn]=>7)无法更新数据:1 与 //die(“无法更新数据:”.print\r($\u POST)); die(“无法更新数据:.mysql_error()) 它表明 无法更新数据: 是否有php显示错误的地方。通常,当我的代码出现问题时,我只会看到一个白色屏幕,并且必

这不起作用,我不知道如何排除故障。 代码如图所示
Array([fName]=>Test[lName]=>Testing[age]=>25[weight]=>199[sex]=>male[heightFt]=>5[heightIn]=>7)无法更新数据:1

//die(“无法更新数据:”.print\r($\u POST));
die(“无法更新数据:.mysql_error())

它表明

无法更新数据:


是否有php显示错误的地方。通常,当我的代码出现问题时,我只会看到一个白色屏幕,并且必须通过尝试和错误来解决问题,加载资源失败:服务器响应状态为500(内部服务器错误)

您混合了mysqli和mysql接口调用。那不行

我们看到正在创建mysqli连接

$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";
但是我们看到了对
mysql\uu
接口函数的调用

$conn = new mysqli(
不要那样做。那不行。使用mysqli函数

所以,首先解决这个问题


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

此外,合并潜在的不安全值(例如来自$\u GET或$\u POST的变量值)会导致SQL注入漏洞。合并到SQL语句文本中的值必须正确转义。请参见
mysqli\u real\u escape\u string
。但这还不足以保证代码不会仍然容易受到SQL注入的攻击

更好的模式是将准备好的语句绑定占位符一起使用


这是不对的

如果
$newFName
是Fred,
$newFName
是Flintstone

那么这个,

$retval = mysql_query(
或者您实际上可能需要这样做:

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

$sql = "update " . $settings[userTable] . " set fName = $newFName, lName = $newLName, ...";
MySQL会对此犹豫不决,因为字符串文字应该用单引号括起来:

 update mytable set fName = Fred, lName = Flintstone, ...
如果
$newLName
是O'Reilly,MySQL将停止,他将看到字符串literal
'O'
后跟MySQL不理解的内容

 update mytable set fName = 'Fred', lName = 'Flintstone', ...
                            ^    ^          ^          ^
为了使其正确运行,我们需要用另一个单引号转义值中的单引号,因此我们的SQL语句如下所示:

 update mytable set fName = 'Fred', lName = 'O'Reilly', ...
                                               ^^^^^^ 
字符串文本中的两个单引号(由MySQL)解释为一个单引号。存储在列中的值(当然假设语句成功)将是我们想要的:O'Reilly

您可以对值进行转义,但更好的模式是使用绑定占位符准备语句

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

参考资料:

您混合了mysqli和mysql接口调用。那不行

我们看到正在创建mysqli连接

$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";
但是我们看到了对
mysql\uu
接口函数的调用

$conn = new mysqli(
不要那样做。那不行。使用mysqli函数

所以,首先解决这个问题


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

此外,合并潜在的不安全值(例如来自$\u GET或$\u POST的变量值)会导致SQL注入漏洞。合并到SQL语句文本中的值必须正确转义。请参见
mysqli\u real\u escape\u string
。但这还不足以保证代码不会仍然容易受到SQL注入的攻击

更好的模式是将准备好的语句绑定占位符一起使用


这是不对的

如果
$newFName
是Fred,
$newFName
是Flintstone

那么这个,

$retval = mysql_query(
或者您实际上可能需要这样做:

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

$sql = "update " . $settings[userTable] . " set fName = $newFName, lName = $newLName, ...";
MySQL会对此犹豫不决,因为字符串文字应该用单引号括起来:

 update mytable set fName = Fred, lName = Flintstone, ...
如果
$newLName
是O'Reilly,MySQL将停止,他将看到字符串literal
'O'
后跟MySQL不理解的内容

 update mytable set fName = 'Fred', lName = 'Flintstone', ...
                            ^    ^          ^          ^
为了使其正确运行,我们需要用另一个单引号转义值中的单引号,因此我们的SQL语句如下所示:

 update mytable set fName = 'Fred', lName = 'O'Reilly', ...
                                               ^^^^^^ 
字符串文本中的两个单引号(由MySQL)解释为一个单引号。存储在列中的值(当然假设语句成功)将是我们想要的:O'Reilly

您可以对值进行转义,但更好的模式是使用绑定占位符准备语句

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

参考资料:

您混合了mysqli和mysql接口调用。那不行

我们看到正在创建mysqli连接

$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";
但是我们看到了对
mysql\uu
接口函数的调用

$conn = new mysqli(
不要那样做。那不行。使用mysqli函数

所以,首先解决这个问题


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

此外,合并潜在的不安全值(例如来自$\u GET或$\u POST的变量值)会导致SQL注入漏洞。合并到SQL语句文本中的值必须正确转义。请参见
mysqli\u real\u escape\u string
。但这还不足以保证代码不会仍然容易受到SQL注入的攻击

更好的模式是将准备好的语句绑定占位符一起使用


这是不对的

如果
$newFName
是Fred,
$newFName
是Flintstone

那么这个,

$retval = mysql_query(
或者您实际上可能需要这样做:

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

$sql = "update " . $settings[userTable] . " set fName = $newFName, lName = $newLName, ...";
MySQL将对此犹豫不决,因为字符串文本应该包含在s中