变量没有传递给sql查询

时间:2016-06-03 22:04:18

标签: php mysql sql

我有一个只有2个字段的数据库。第一个是数字列表,第二个是数字的状态。我正在尝试使用一个表单,允许我批量输入数字列表并将其状态更新为已使用。我无法弄清楚我搞砸了哪里。非常感谢任何和所有帮助。

PHP     

$pin=$_POST['pin'];
$xx=explode("\n", $pin);

$sql="UPDATE new_table SET Status = 'used' WHERE number = '". $pin . "'";
foreach($xx as $pin){
    if($pin!=""){

    $sql.="('".trim($pin)."'),";
    }
}
$sql=substr($sql,0,-1);

$mysql=new mysqli('127.0.0.1', '******', '********', '******');
$mysql->query($sql);
$mysql->close();

}

?>

表格

<html>

<body>
<form method="post">
    <label> Enter Sims (1 for each line)</label>
    <br/>
    <textarea rows="10" cols="100" name="pin" ></textarea>
    <br/>
    <input type="submit" value="save" />
</form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

警告:您的代码以及此答案中的代码示例可能容易受到SQL-injection攻击。

假设您的$_POST['pin']包含这样的数据(用\n分隔的单个多行字符串):

1234
5678
9012

将其直接放入查询字符串将导致查询:

UPDATE new_table SET Status = 'used' WHERE number = 1234
5678
9012

这将产生语法错误,因此不会执行查询。

了解您的目标,您需要更新该字段的状态,其中number字段为IN其中一个引脚。正确的查询应如下所示:

UPDATE new_table SET Status = 'used' WHERE number IN (1234, 5678, 9012)

要实现此目的,您可以使用implode功能。因此,要创建类似于上面的查询,您可以按如下方式更改代码:

$pin = $_POST['pin'];
$xx = implode(",", explode("\r\n", $pin));

$sql = "UPDATE new_table SET Status = 'used' WHERE number IN (". $xx . ")";

$mysql=new mysqli('127.0.0.1', '******', '********', '******');
$mysql->query($sql);
$mysql->close();