我在SQL语句中遇到变量问题。我有一个表单,用户可以在其中更新他的个人资料。表单重定向到action.php?action=settings
当我尝试不使用$variables时,没有问题但问题是,我有很多这样的查询,但不是为了更新。
function change_user_data($trainer) {
require("database.php");
try {
$results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");
} catch (Exception $e) {
echo "Data could not be changed!";
exit;
}
}
这是我的action.php
if ($action == "settings") {
$email = $_POST['email'];
$status = $_POST['status'];
$password = $_POST['password'];
change_user_data($trainer);
}
当我echo
那些$variables
时,它们会被显示出来,所以它们不是空的。但是这个查询更新了我的表,但没有任何数据,所以之后所有内容都是空的。
我认为问题在于可变范围。
在函数外定义的变量不能在函数中使用,全局变量或其他变量除外。
你有两种方法。
首先。如果change_user_data函数在action.php文件中,则添加"global$email,$status,$password",如下所示:
function change_user_data($trainer) {
global $email, $status, $password;
require("database.php");
try {
$results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");
} catch (Exception $e) {
echo "Data could not be changed!";
exit;
}
}
或者第二个。将电子邮件、状态、密码数据传递给功能。然后你就可以使用它了。
请查看本手册:
http://php.net/manual/en/language.variables.scope.php
你可以试试这个:
$results = $db->query("UPDATE trainer SET email='".$email."', status='".$status."', password='".$password."' WHERE name='".$trainer."'");
change_user_data($trainer, $email, $password, $status);
function change_user_data($trainer, $email, $password, $status) {
require("database.php");
try {
$results = $db->query("UPDATE trainer SET email='$email', status='$status', password='$password' WHERE name='$trainer'");
} catch (Exception $e) {
echo "Data could not be changed!";
exit;
}
}
获取后发布变量,然后检查这些变量不管那些是不是空的如果不是空或NULL,则使用非空变量更新查询更新数据库
可能是
- 列的数据类型错误。仔细检查你的桌子结构。示例:如果将列电子邮件设置为int,则无法将其行值插入或更新为文本或字母
- 单引号内的变量不正确。尝试连接变量和查询字符串以获得更好的实践
如果这些不起作用
尝试使mysql语法错误,并检查这些变量的值,然后可以定义错误。
抱歉我的英语不好
这个函数很少有问题:
- 范围界定问题,您没有传递所有值
- 您容易受到sql注入的攻击
- 你不检查记录是否更新
功能:
function change_user_data($db, $params) {
try {
$sql = "UPDATE trainer SET email= ?, status=?, password=? WHERE name=?";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$success = ($stmt->rowCount() > 0) ? true : false;
} catch (Exception $e) {
echo "Data could not be changed!";
$success = false;
}
return $success;
}
用法
require("database.php");
$params = array($trainer, $email, $password, $status);
$user_data_updated = change_user_data($db, $params);
if($user_data_updated){
echo 'user data updated';
}else{
echo 'user data did not update';
}