我目前有一个Get varible
$name = $_GET['user'];
我试图将它添加到我的sql语句中,如下所示:
$sql = "SELECT * FROM uc_users WHERE user_name = ". $name;
并运行
$result = $pdo -> query($sql);
我收到了无效的列名。但这没有意义,因为如果我手动提出这样的请求
$sql = "SELECT * FROM uc_users WHERE user_name = 'jeff'";
我得到列数据,而不是当我将其作为get变量输入时。我究竟做错了什么。我对pdo来说比较新。
更新: 现在我有以下内容:
$name = $_GET['user'];
和
$sql = "SELECT * FROM uc_users WHERE user_name = :name";
//run the query and save the data to the $bio variable
$result = $pdo -> query($sql);
$result->bindParam( ":name", $name, PDO::PARAM_STR );
$result->execute();
但我正在
> SQLSTATE[42000]: Syntax error or access violation: 1064 You have an
> error in your SQL syntax; check the manual that corresponds to your
> MySQL server version for the right syntax to use near ':name' at line
> 1
答案 0 :(得分:5)
对于使用变量工作的查询,就像没有变量的变量一样,您需要在变量周围加上引号,因此请将查询更改为:
$sql = "SELECT * FROM uc_users WHERE user_name = '$name'";
但是,这很容易受到SQL注入的影响,所以你真正想要的是使用占位符,如下所示:
$sql = "SELECT * FROM uc_users WHERE user_name = :name";
然后按照你的要求做好准备:
$result = $pdo->prepare( $sql );
接下来,绑定参数:
$result->bindParam( ":name", $name, PDO::PARAM_STR );
最后,执行它:
$result->execute();
答案 1 :(得分:1)
试试这个。你没有对变量单引号。
$sql = "SELECT * FROM uc_users WHERE user_name = '". $name."'";
Note
:尝试使用Binding方法。这不是获取数据的有效方法。
答案 2 :(得分:1)
$sql = "SELECT * FROM 'uc_users' WHERE user_name = '". $name."' ";
答案 3 :(得分:0)
在SQL中,字符串应始终涂有单引号(''
)。
但是,您可以输入不带引号的数字。
这是因为,当我们输入不带引号的字符串时,SQL会将其视为保留关键字/字段名称。
这样,它可能会导致故障。
所以,正确的语法应该是:
sql = "SELECT * FROM uc_users WHERE user_name = '$name'";
答案 4 :(得分:0)
在防止SQL注入的同时,我发现这最适合我的口味:
编辑:如@YourCommonSense所指出的,您应该按照以下guidelines
使用安全连接// $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$sql = 'SELECT * FROM uc_users WHERE user_name = ?';
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
// perhaps you'll need these as well
$count = $result->num_rows;
$row = $result->fetch_assoc();
/* you can also use it for multiple rows results like this
while ($row = $result->fetch_assoc()) {
// code here...
} */
顺便说一句,如果您有更多参数,例如
$sql = 'SELECT * FROM table WHERE id_user = ? AND date = ? AND location = ?'
其中第一个?
是整数,第二个?
和第三个?
是字符串/日期/ ...,您可以将它们与
$stmt->bind_param('iss', $id_user, $date, $location);
/*
* i - corresponding variable has type integer
* d - corresponding variable has type double
* s - corresponding variable has type string
* b - corresponding variable is a blob and will be sent in packets
*/
来源:php.net
当心!您无法在bind_param
相反,您串联之前:
$full_name = $family_name . ' ' . $given_name;
$stmt->bind_param('s', $full_name);