【问题标题】:Can't insert into mysql Auto Increment row from PHP, but can insert manually from phpmyadmin with same statement无法从 PHP 插入 mysql Auto Increment 行,但可以使用相同的语句从 phpmyadmin 手动插入
【发布时间】:2013-03-29 15:15:16
【问题描述】:

所以我的问题是:

我无法从我的 php 插入自动递增的列

(unless I set the insert values to: '','','','$postdate','posttime').

但是:当我在 phpmyadmin 中使用下面的 DEBUGGED insert 语句时,它运行时不用担心。 因此,有些东西阻止了我从我的 php 代码中插入。

这是我的代码:

$qinsert    =   "INSERT INTO `post` (text,sender,text_stamp,post_date,post_time) VALUES ('$message','$sender_id','$date','$postdate','$posttime')";
$finsert    =   mysql_query($qinsert);
$postID     =   mysql_insert_id();

这是调试器的输出:

 Date: Fri, 29 Mar 2013 11:02:53 -0400
 Sender: User's Name 
Message:
 Message Text
 Attachment: 
 Post-Date: 2013-03-29
 Post-Time: 08:02:55

 Q-INSRT: INSERT INTO `post` (text,sender,text_stamp,post_date,post_time) VALUES ('Message Text','User's Name ','Fri, 29 Mar 2013 11:02:53 -0400','2013-03-29','08:02:55')
  F-INST: 
  Post-ID: 

【问题讨论】:

标签: php mysql insert phpmyadmin auto-increment


【解决方案1】:

您是否在将变量放入数组之前对其进行转义?我不确定您的示例查询是否替换了文本和用户名,或者是逐字复制粘贴的。我将假设是后者,因此请仔细查看您的查询:

[...] VALUES ('Message Text','User's Name ','Fri, [...]

“用户名”中间有一个撇号,因此会中断查询。确保在将每个变量插入查询之前对每个变量运行 mysql_real_escape_string($variable)。

$message_text = mysql_real_escape_string($_POST['message_text']);
$user_name = mysql_real_escape_string($_POST['user_name']);
$query = "INSERT INTO table (text, username) values ('$message_text', '$user_name')";
mysql_query($query);

【讨论】:

  • 这不起作用,当我为每个变量放置该函数时,我在调试器中返回了 '','',''
  • 您是否先使用 mysql_connect() // mysql_select_db() 连接到 mysql ?并确保连接成功?
  • 我没有为连接放置调试器,但我能够插入空白来代替我的 php 代码中的变量。所以这就是为什么我认为连接正常
  • 另外,另一个网站正在使用相同的连接,只是使用不同的数据库名称和密码,所以我想为什么要修复一些没有损坏的东西
【解决方案2】:

你需要转义你的字符串,User's Name 有一个单引号。您也不应该使用mysql_ 函数,它们已被弃用。但如果你坚持,请使用mysql_real_escape_string(),比如:

$qinsert    =   "INSERT INTO `post` (text,sender,text_stamp,post_date,post_time) VALUES ('" . mysql_real_escape_string($message) . "','" . mysql_real_escape_string($sender_id). " ','$date','$postdate','$posttime')";

您可能应该转义所有字符串,而不仅仅是消息和发件人。

理想情况下,您应该使用 PDO,如下所示:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);
$sth = $dbh->prepare(
  "INSERT INTO post (text,sender,text_stamp,post_date,post_time) VALUES " .
  "(:message, :sender_id, :date, :postdate, :posttime)"
);
$sth->execute(array(
  ':message' => $message,
  ':sender_id' => $sender_id,
  ':date' => $date,
  ':postdate' => $postdate,
  ':posttime' => $posttime
));

【讨论】:

  • 这不起作用,当我输入时,我在调试器中返回了 '','','': $qinsert = "INSERT INTO post (text,sender,text_stamp,post_date, post_time) VALUES ('" . mysql_real_escape_string($message) . "','" . mysql_real_escape_string($sender_id) . "','" . mysql_real_escape_string($date) . "','$postdate','$posttime') ";
  • 你在连接 MySQL 后是否调用mysql_real_escape_string?没有连接就无法工作。
  • 是的,我的连接很好。我可以知道,因为我能够为 $message、$sender_id、$date 插入空白记录,如 ''、''、'',如上所述
  • 我已经用 PDO 语法更新了我的回复。你真的应该使用它而不是 mysql_ 函数。
  • 我将把它保存为最后的手段,但我有许多 mysql 函数可用于我拥有的另一个站点。我也为此使用相同的语法,但我无法让它工作:(
【解决方案3】:

这成功了:

require '../connect.php';
$email = file_get_contents('php://stdin');
preg_match_all("/(.*):\s(.*)\n/i", $email, $matches);

$message    = $matches[1][18];
$message    = str_replace('<HTML><HEAD></HEAD><BODY style="background-color:#ffffff">', '',$message);
$message    = explode('<',$message);
$message    = $message[0];
$sender     = $matches[2][2];
$sender     = explode('<',$sender); 
$sender_id  = $sender[0];

mysql_query("INSERT INTO `post` (`text`,`sender`,`text_stamp`,`post_date`,`post_time`) VALUES ('" . mysql_real_escape_string($message) . "','" . mysql_real_escape_string($sender_id) . "','" . mysql_real_escape_string($textdate) . "','$postdate','$posttime')") or die(mysql_error() . "<--There was error processing the query");

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多