每次我用$ _我必须使用@

问题描述:

前。

$fn = htmlentities(mysqli_real_escape_string($connection, @$_POST['fname'])); 
$ln = htmlentities(mysqli_real_escape_string($connection, @$_POST['lname'])); 
$em = htmlentities(mysqli_real_escape_string($connection, @$_POST['email'])); 
$em2 = htmlentities(mysqli_real_escape_string($connection, @$_POST['email2'])); 
$pd = htmlentities(mysqli_real_escape_string($connection, @$_POST['password'])); 
$pd2 = htmlentities(mysqli_real_escape_string($connection, @$_POST['password2'])); 


同样的事情$ _SESSION

发生,如果我走了 “@” 关我得到一个未定义的索引错误...
任何想法,为什么?我不......所有的代码工作,如果我继续他们。

+2

实际设置的值是?如果不是简单地在尝试使用这些值之前添加'isset()'测试。 – Pitchinnate

+1

是的。不要使用错误抑制,修复实际的错误。在这种情况下,您显然在尝试使用它之前没有检查该值是否已设置。 –

请务必检查在尝试访问它之前使用isset()数组元素的值的存在。你得到一个未定义索引的原因是因为你的POST数据中的其中一个值不存在。

if (isset($_POST['fname'])) 
{ 
    $fn = htmlentities(mysqli_real_escape_string($connection, $_POST['fname'])); 
} 
else 
{ 
    $fn = ''; 
} 

我假设你知道@是。否则,它是错误抑制运算符。这将关闭每个使用过的实例的错误报告,然后再打开错误报告。当你绝对必须时,你只会想要使用它,因为它阻止你看到你可能想看到的东西。

这可能意味着您正在访问阵列的值而没有检查它们是否被检查过...
可以使用issetif ($_POST['fname'])

不管你做什么,不要降低自己的错误报告模式(你E_STRICT | E_ALL可能是)。在我的书中,使用@来抑制错误是错误的做法,顺便说一下。该通知在内部引发,因此您正在放慢代码,然后看起来很乱。你养殖的坏习惯(转向邪恶@标志,而不是解决问题)......

您可以使用类似这样

foreach (array('fname', 'lname', 'email') as $key) { 
    $$key = isset($_POST[$key]) && is_string($_POST[$key]) ? htmlentities(mysqli_real_escape_string($_POST[$key])) : ''; 
} 

有变量$ FNAME,LNAME $,$电子邮件等。不要复制和粘贴。