没有bind_param的mysqli预处理语句

时间:2014-03-01 14:32:17

标签: php mysql sql mysqli

我有这个代码用于从用户表

上的最新记录中选择fname
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$sdt=$mysqli->('SELECT fname FROM user ORDER BY id DESC LIMIT 1');
$sdt->bind_result($code);
$sdt->fetch();
echo $code ;

我之前使用带有bind_param的预处理语句。但是现在在上面的代码中第一次我想使用没有bind_param的预处理语句而且我不知道如何在不使用bind_param的情况下从表中选择。请告诉我如何做到这一点?

3 个答案:

答案 0 :(得分:3)

我无法相信有太多尝试而且所有失败

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$res = $mysqli->query('SELECT fname FROM user ORDER BY id DESC LIMIT 1');
echo current($res->fetch_row());

答案 1 :(得分:1)

答案是对SQL注入开放。使用预准备语句而不是正确准备数据有什么意义。您永远不应该只在查询行中放置一个字符串。准备好的陈述的重点是准备好了。这是一个例子

$query = "SELECT `Customer_ID`,`CompanyName` FROM `customers` WHERE `Customer_ID`=?";
$stmt = $db->prepare($query);
$stmt->bind_param('i',$_POST['ID']);
$stmt->execute();
$stmt->bind_result($id,$CompanyName);

在Raffi的代码中你应该这样做

$bla = $_POST['something'];
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$stmt = $mysqli->prepare("SELECT `fname` FROM `user` WHERE `bla` = ? ORDER BY `id` DESC LIMIT 1");
$stmt->bind_param('s',$_POST['something']);
$stmt->execute();
$stmt->bind_result($code);
$stmt->fetch();
echo $code;

请注意,我不知道您的帖子数据是字符串还是整数。如果它是一个整数,你会把

$stmt->bind_param('i',$_POST['something']);

代替。我知道你说没有绑定参数,但相信我,如果你从一个页面接收输入,而不是先正确准备它,那真的很糟糕。

答案 2 :(得分:-2)

实际上,如果我更正了你的剧本,那就是这样的:

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$sdt = $mysqli->prepare('SELECT fname FROM user ORDER BY id DESC LIMIT 1');
$sdt->execute();
$sdt->bind_result($code);
$sdt->fetch();
echo $code;

所以,没有bind_param,通常这对我有用:

$bla = $_POST['something'];
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$stmt = $mysqli->prepare("SELECT fname FROM user WHERE bla = " . $bla . " ORDER BY id DESC LIMIT 1");
$stmt->execute();
$stmt->bind_result($code);
$stmt->fetch();
echo $code;

这可能会有所帮助。