压缩PHP代码/查询

压缩PHP代码/查询,php,sql,sqlite,Php,Sql,Sqlite,我试图大幅减少PHP代码中的重复次数。我尝试做的事情之一是在SQLite查询中使用$\u POST值。以下是我尝试组合的两段代码: $result = $database -> query("SELECT password FROM accounts WHERE email = '$emailOrUsername' OR username = '$emailOrUsername'") -> fetchColumn(); 以及: 变成这样: $result = $database -

我试图大幅减少PHP代码中的重复次数。我尝试做的事情之一是在SQLite查询中使用$\u POST值。以下是我尝试组合的两段代码:

$result = $database -> query("SELECT password FROM accounts WHERE email = '$emailOrUsername' OR username = '$emailOrUsername'") -> fetchColumn();
以及:

变成这样:

$result = $database -> query("SELECT password FROM accounts WHERE email = $_POST["emailOrUsername"] OR username = $_POST["emailOrUsername"]") -> fetchColumn();
$sql = "SELECT password FROM accounts WHERE email = '{$_POST['emailOrUsername']}' OR username = '{$_POST['emailOrUsername']}'"; // watch out for the quotes " vs '

$result = $database -> query($sql) -> fetchColumn();
$_POST['emailOrUsername']=mysql_real_escape_string($_POST['emailOrUsername']);
$result = $database -> query("
SELECT password 
FROM accounts 
WHERE email = '{$_POST['emailOrUsername']}' OR 
    username = '{$_POST['emailOrUsername']}'
") -> fetchColumn();
有人能告诉我如何组合这两段代码吗?

这样做:

$result = $database -> query("SELECT password FROM accounts WHERE email = $_POST["emailOrUsername"] OR username = $_POST["emailOrUsername"]") -> fetchColumn();
$sql = "SELECT password FROM accounts WHERE email = '{$_POST['emailOrUsername']}' OR username = '{$_POST['emailOrUsername']}'"; // watch out for the quotes " vs '

$result = $database -> query($sql) -> fetchColumn();
$_POST['emailOrUsername']=mysql_real_escape_string($_POST['emailOrUsername']);
$result = $database -> query("
SELECT password 
FROM accounts 
WHERE email = '{$_POST['emailOrUsername']}' OR 
    username = '{$_POST['emailOrUsername']}'
") -> fetchColumn();
缺点:
*输入未被清理-->sql注入风险
*不检查
$\u POST

可能的解决方案:

*参数化查询(请参见php.net)

我认为您的问题在于,您试图将已命名的键索引数组插入字符串中,但不知道如何执行。有两种解决方案:

$result = $database -> query("
SELECT password 
FROM accounts 
WHERE email = '{$_POST['emailOrUsername']}' OR 
    username = '{$_POST['emailOrUsername']}'
") -> fetchColumn();
这是第一个,注意数组周围的
{
}
,索引用单引号括起来

第二种方法是:

$result = $database -> query("
SELECT password 
FROM accounts 
WHERE email = '".$_POST["emailOrUsername"]."' OR 
    username = '". $_POST["emailOrUsername"]."'
") -> fetchColumn();
请注意,字符串文字是这样断开的:
“text”。$variable。“text”
,这意味着文本将连接在一起。
类似于“+”——将值连接到一个字符串中。(对不起,我希望这个解释不要太混乱)

p、 还请注意,我添加了如下单引号:
email='$email'
,缺少这些引号,因为如果没有它们,您的查询将无法工作,因为即使在MySQL中,文本也必须用引号括起来

编辑

为了保护自己免受
sql注入的影响
您应该使用
mysql\u real\u escape\u string()函数清理任何用户输入。代码将如下所示:

$result = $database -> query("SELECT password FROM accounts WHERE email = $_POST["emailOrUsername"] OR username = $_POST["emailOrUsername"]") -> fetchColumn();
$sql = "SELECT password FROM accounts WHERE email = '{$_POST['emailOrUsername']}' OR username = '{$_POST['emailOrUsername']}'"; // watch out for the quotes " vs '

$result = $database -> query($sql) -> fetchColumn();
$_POST['emailOrUsername']=mysql_real_escape_string($_POST['emailOrUsername']);
$result = $database -> query("
SELECT password 
FROM accounts 
WHERE email = '{$_POST['emailOrUsername']}' OR 
    username = '{$_POST['emailOrUsername']}'
") -> fetchColumn();
或内联:

$result = $database -> query("
SELECT password 
FROM accounts 
WHERE email = '".mysql_real_escape_string($_POST["emailOrUsername"])."' OR 
    username = '".mysql_real_escape_string($_POST["emailOrUsername"])."'
") -> fetchColumn();

请不要直接在查询中使用
$\u POST
数据。这对于SQL注入来说是一个严重的漏洞……实际上,您需要更多的代码,而不是更少的代码。理想情况下,您应该将其分为准备、绑定和执行步骤。对不起,我真的是个新手。为什么在查询中放置表单值是错误的?这怎么可能是个问题?嗨,这不是问题,这是不安全的。如果有人在输入字段中填写
emailOrUsername
字符,如
或mysql代码,他们将使您的脚本崩溃或执行您意想不到的操作。这就是为什么您应该通过
mysql\u real\u escape\u string()传递任何用户输入(如
$\u POST
变量)<代码>函数。您可以将该调用包含在查询本身中(参见我的答案)。对<代码> SQL注入< /代码>做一点研究。请考虑接受一个答案(点击左边的刻度标记)。如果它真的回答了你的问题,我想一些有男子气概的人不喜欢在sql查询中插入未初始化的变量:)…我想没有必要对这样的人太生气(Guy问起语法,他们回答,“使用mysqli…”)