2013-04-14 35 views
-1

在我的PHP文件,我得到了一个SQL查询看起来像这样:准备SQL查询

if(isset($_GET['id'])) 
{ 
    $id = $_GET['id']; 
    $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'"; 
    $row = mysqli_query($con, $q) or die(mysqli_error($con)); 
    while($r = mysqli_fetch_assoc($row)) 
    { 
     $objekt = $r; 
    } 
} 

我意识到这是关于SQL注入和这样非常不安全的做法,所以我一直在寻找到准备的SQL querys ,使用绑定参数。看着bobby-tables.com我看到这个例子查询:

$stmt = $db->prepare('update people set name = ? where id = ?'); 
$stmt->bind_param('si',$name,$id); 
$stmt->execute(); 

我不明白,我应该怎么修改我的当前查询匹配使用绑定参数更安全的一个。任何帮助表示赞赏。

回答

1

用同样的方法

$mysqli = new mysqli("localhost", "my_user", "my_password", "db"); 

if(isset($_GET['id'])) 
{ 
    $id = $_GET['id']; 
    $q = "SELECT some_field FROM `objekt_t` WHERE `id`= ?"; 

    if ($stmt = $mysqli->prepare($q)) {  
     $stmt->bind_param("i", $id); 
     $stmt->execute(); 
     $stmt->bind_result($result); 
     $stmt->fetch(); 
    } 
} 

现在$结果变量包含您查询的结果。

+0

我查询的结果是在'$ stmt'还是'$ result'中? –

+0

我刚刚编辑过这篇评论。 $ result变量在脚本执行后包含查询的结果。 – zavg

+0

尝试'var_dump($ result);'给我NULL。为什么是这样? –

1

准备语句将原始数据传输到查询,以便SQL注入是不可能的。没有必要为real_escape_String或任何其他格式化函数转义,因为这样做对你有用。

例子:

$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE Username=?"); 
$statement->bind_param('s',$_POST['Username']); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 

,因为数据被发送为原料,因此即使查询中包含注射剂的形式,为$ _ POST [我基本上是直接结合我的$ _ POST数据查询'用户名'];该查询将正常运行。


中的过程和OOP风格而言,它的下跌喜好,我personlly喜欢OOP风格在其他选项,因为它是更具可读性。

与数字打交道:

$ID= 5; 
$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE ID=?"); 
$statement->bind_param('i',$ID); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 

或者你可以用精确值直接在声明中工作:

$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE ID='5'"); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 
+0

如何我使用查询的结果呢?尝试'var_dump($ resultCol);'给我null。我不明白如何使用/调用查询的结果。 –

+0

通过我的修改,您应该修改'prepare'中的查询以从您的数据库返回有效的结果。 bind_result会将一个变量绑定到所使用的列上,所以如果您在查询中选择4列,则需要分配4个变量 –

+0

如果我将整个'prepare'行更改为'$ db-> prepare( “SELECT * FROM objekt_t WHERE id =?”);'和下面一行到'bind_param('s','5');',只有1列可以被选作我的表中只有1列'ID ='5''。当我尝试'var_dump($ resultCol);'时,这仍然没有给我提供任何帮助。我觉得我失去了一些明显的东西。 –

0

你可以这样说:

$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?'); 
$stmt->bind_param('i', $id); 
$stmt->execute(); 

$result = $stmt->get_result(); 

while ($row = $result->fetch_assoc()) { 
    // $row is an associative array 
} 
+0

更改行'// $行是关联数组''var_dump($ row);'执行时给我一个空文档,为什么? –

+0

get_result方法需要MySQL本地驱动程序(mysqlnd)。可能是你没有安装它。 – jithujose