无法在pdo语句中连接sql

时间:2014-01-13 06:19:54

标签: php mysql sql pdo

我目前有一个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

5 个答案:

答案 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

内串联$ variables

相反,您串联之前:

$full_name = $family_name . ' ' . $given_name;
$stmt->bind_param('s', $full_name);