发布到数据库

时间:2011-07-11 20:24:07

标签: php

所以我有这样的代码,它接受一个消息/帖子用户插入,它意味着将它发布到数据库,然后显示和一个单独的页面。我得到了显示公园工作正常它只是试图插入数据库这是问题
这个代码......

<?php  
mysql_connect("localhost", "root", "");  
mysql_select_db("test");     
$time = time();  
mysql_query "INSERT INTO threads (title, message, author, dated);" 
VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','0','$time');      
echo "Thread Posted.<br><a href='Untitled9.php'>Return</a>";  
?> 

不会将信息发布到数据库中!

为什么会这样,以及如何解决?

  id      int(11)                          No None AUTO_INCREMENT               
  title   varchar(255)  latin1_swedish_ci  No None                
  message text           latin1_swedish_ci  No None                
  author  varchar(255)   latin1_swedish_ci  No None                
  replies int(11)                           No None                
  posted  varchar(255)   latin1_swedish_ci  No None                
  votes_up int(11)                          No 0                
  votes_down int(11)                        No 0 

5 个答案:

答案 0 :(得分:2)

更新

应张贴未注明日期。

继承你的问题:

mysql_query "INSERT INTO threads (title, message, author, posted);" 
VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','0','$time');  

将其更改为:

mysql_query("INSERT INTO threads (title, message, author, posted) VALUES ('$_POST[title]','$_POST[message]','$_POST[author]','$time');"); 

我看到你也有空值,这让我相信你使用带有自动增量的ID,如果是这种情况,你也需要提供它。例如:

编辑:此处

mysql_query("INSERT INTO threads (id,title, message, author, posted) VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','$time');"); 

请注意,直接从帖子数据中插入值是不安全的,会让您受到各种攻击。

答案 1 :(得分:0)

mysql_query "INSERT INTO threads (title, message, author, dated);" 
VALUES ('$_POST[title]','$_POST[message]','$_POST[author]','$time');

你早早结束了String。应该是:

mysql_query("INSERT INTO threads (title, message, author, dated)
  VALUES ('$_POST[title]','$_POST[message]','$_POST[author]','$time')"); 

此外,您的代码很可能成为SQL注入的目标。您应该使用MySQLi - 类和PreparedStatement来插入帖子。

答案 2 :(得分:0)

您尝试添加到新行的值多于指定的值。

mysql_query "INSERT INTO threads (title, message, author, dated);" 

是您要设置的4个值

VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','0','$time');  

你正在分配6个值。

这是不可能的

同时验证$ _POST数据=阅读此Never trust user input

阅读手册PHP & MYSQL

答案 3 :(得分:0)

分号结束了你的sql语句。您的查询尚未完成。您仍然需要指定要插入的值。

答案 4 :(得分:0)

问题数量:

  1. 如果你把$ _POST []放在一个字符串中你需要把它放在大括号{$ _POST []}中,否则PHP就不会破译变量
  2. 接下来需要引用$ _POST []中变量的名称,以便PHP不认为它们是常量,所以它们需要像$ _POST ['title']或$ _POST [“title”]
  3. 正如其他人所说,你需要通过过滤发布的变量来防止SQL注入。最安全的方法是使用PDO,我在下面列举了一个例子。你可以改进这一点。
  4. 打开错误报告,以便在调试时看到错误
  5. 这是经过测试的代码:

    ini_set('error_reporting', E_ALL | E_STRICT);
    ini_set('display_errors', 'On');
    $user='root';
    $pass='';
    $dsn = 'mysql:dbname=test;host=localhost'; //for PDO later
    
    mysql_connect("localhost",$user , $pass);  
    mysql_select_db("test");     
    $time = time();  
    if (isset($_POST) && !empty($_POST))
    {
    // using braces {}
    $sql=<<<SQL
    INSERT INTO threads (title, message, author, posted) 
    VALUES ('{$_POST['title']}','{$_POST['message']}','{$_POST['author']}','$time')
    
    SQL;
    
    echo "$_POST[title]"."Thread Posted.<br><a href='Untitled9.php'>Return</a>";
    
    // now a PDO version of the same
    try {
        $pdo = new PDO($dsn, $user, $pass);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();die;
    }
    
    $sth = $pdo->prepare("INSERT ino threads (title, message, author, posted)
                      VALUES (:title,:message,:author,:posted)");
    $sth->execute(array(':title' => $_POST['title'],':message' => $_POST['message'], ':author' => $_POST['author'] ,':posted' => $time));
    echo "Affected rows=".$sth->rowCount().",we are on line=".__LINE__."<br />";
    echo $_POST['title']." Thread Posted.<br><a href='Untitled9.php'>Return</a>";
    
    } // close if $_POST