2013-06-01 165 views
1

让我提,我非常新的PHP 我有这样的代码PHP POST返回null结果

<?php 
$phone=$_POST['phone']; 
$tagline=$_POST['tagline']; 
$activity=$_POST['activity']; 
$about=$_POST['about']; 
$date=date(d-m-y); 
$status='ok'; 
$con=mysqli_connect("localhost","root","","database"); 
mysqli_query($con,"UPDATE owners set phone='$phone',tagline='$tagline',status='$status',activity='$activity',about='$about',date='$ date' where username='deiin'"); 
mysqli_close($con); 

?> 

是suppost更新表,但它返回 通知开始:未定义指数:手机E:\ EasyPHP-5.3.5.0 \ www \ register \ finishing \ index.php 3行 有帮助吗?

+1

如果用户没有填写表单或表单被破坏,你能显示你的HTML表单代码 –

+0

,这个脚本将失败。您必须验证用户是否将这些数据放在那里,并验证这些数据是您真正想要的“好”数据。否则不好的事情会发生 – enrey

+3

做一个print_r($ _ POST);看看有什么真的在.. ..你说的是GET不POST! –

回答

1

您可能想调试您的代码,因为PHP-Notice并未停止执行代码。

如果你的数据库没有更新,你应该尝试mysql_error()看你的mysql语法是否有错误。

不要看到什么$ _ POST参数进来做的print_r($ _ POST)

编辑:

是(如Lepidosteus说):你的代码是从MySQL注入脆弱。看here什么是注射,看看here如何防止它们。

希望对大家有所帮助:)

1

试试这个样子,现在,所有的字段是必须的,所以没有数据将被存储到数据库中,如果用户不填写的所有字段。

但是在你的小型家庭应用中使用它,不要把它放在生产服务器上,因为它仍然很容易被注入。

if(isset($_POST['phone']) 
    && isset($_POST['tagline']) 
    && isset($_POST['activity']) 
    && isset($_POST['about'])){ 

    $phone = $_POST['phone']; 
    $tagline = $_POST['tagline']; 
    $activity = $_POST['activity']; 
    $about = $_POST['about']; 

    $date=date('d-m-y'); 
    $status='ok'; 
    $con=mysqli_connect("localhost","root","","database"); 
    mysqli_query($con,"UPDATE owners 
         SET phone='$phone', tagline='$tagline',status='$status',activity='$activity',about='$about',date='$date' 
         WHERE username='deiin'"); 
    mysqli_close($con); 
} 

还是这个样子,活动,大约是可选:

if(isset($_POST['phone']) 
    && isset($_POST['tagline']){ 

    $phone = $_POST['phone']; 
    $tagline = $_POST['tagline']; 

    if(isset($_POST['activity'])) $activity = $_POST['activity']; 
    else $activity = ''; 

    if(isset($_POST['about'])) $about = $_POST['about']; 
    else $about = ''; 

    $date=date('d-m-y'); 
    $status='ok'; 
    $con=mysqli_connect("localhost","root","","database"); 
    mysqli_query($con,"UPDATE owners 
         SET phone='$phone', tagline='$tagline',status='$status',activity='$activity',about='$about',date='$date' 
         WHERE username='deiin'"); 
    mysqli_close($con); 
} 

但同样,要知道,有一个在这个代码巨大的安全漏洞,所以不要把这个生产服务器上。如果有人在表单中写了“引号”,它将被插入到sql查询中,并且它将成为那里的结束引号,因此引用之后的任何内容都将被解释为sql命令。这样,每个周围的小丑都可以在一秒钟内删除整个数据库。使用mysqli_real_escape_string()或准备语句

编辑: 如何使用mysqli_real_escape_string():

,而不是例如$phone = $_POST['phone'];,您括在mysql_real_escape_string()这样的:

$phone = mysql_real_escape_string($_POST['phone']); 

Couldn”不那么简单,可以吗? :)

,并记得引用everyhing查询,像你这样的:

UPDATE owners SET phone=  ---> '$phone' <--- /*those quotes are 
important for it to work, remember to keep them there */ 

我不想解释预处理语句,因为程序的语法是怪异和OOP语法可能会显得更加古怪给你。

+0

为什么mysql_real_escape_string不好:http:/ /johnroach.info/2011/02/17/why-mysql_real_escape_string-isnt-enough-to-stop-sql-injection-attacks/ –

+1

@ Jan1337z是的,我期待这种评论,但不是那么快......好吧,首先,他用引号,其次,谁在乎?重点在于了解它,理智的人无论如何都使用准备好的陈述。 – enrey

1
<?php 
////////////you use//////// 
echo "<pre>"; 
print_r($_REQUEST); 
echo "</pre>"; 
die("here"); 

$phone=$_POST['phone']; 
$tagline=$_POST['tagline']; 
$activity=$_POST['activity']; 
$about=$_POST['about']; 
$date=date(d-m-y); 
$status='ok'; 
$con=mysqli_connect("localhost","root","","database"); 
mysqli_query($con,"UPDATE owners set phone='$phone',tagline='$tagline',status='$status',activity='$activity',about='$about',date='$ date' where username='deiin'"); 
mysqli_close($con); 

?> 

$_REQUEST将返回值是否发送方法是POST或GET或饼干//可以使用get方法

+0

显示你的html代码,所以我会尝试解决你的问题....... –

1

你必须经常检查数组是你有什么索引你问。 因此,使用isset()函数在你的代码的功能是这样的:

<?php 
$phone = isset($_POST['phone']) ? $_POST['phone'] : null; 
$tagline = isset($_POST['tagline']) ? $_POST['tagline'] : null; 
$activity = isset($_POST['activity']) ? $_POST['activity'] : null; 
$about = isset($_POST['about']) ? $_POST['about'] : null; 
$date = date('d-m-y'); 
$status='ok'; 
$con=mysqli_connect("localhost","root","","database"); 
mysqli_query($con,"UPDATE owners set phone='$phone',tagline='$tagline',status='$status',activity='$activity',about='$about',date='$ date' where username='deiin'"); 
mysqli_close($con); 
?> 

它可以帮助通知,但我强烈建议更换你使用PDO对象来查询数据库,并mysqli_real_escape_string功能逃避可能的SQL注入。