0

我是 PHP/MYSql 的新手,我正在尝试构建一个提交给 MYSql 的表单。这是表单代码:

    <form action="insert.php" method="post">
    First Name: <input type="text" name="first"><br>
    Last Name: <input type="text" name="last"><br>
    Phone: <input type="text" name="phone"><br>

    <input type="Submit">
    </form>

这是insert.php:

<?php 
include "db-connect.php";

$first = $_POST['first'];
$last = $_POST['last'];
$phone = $_POST['phone'];

$query = "INSERT INTO users VALUES ('', '$first', '$last', '$phone')";
$result= mysql_query($query);

if($result) {
    echo "Data entered Successfully";
} else {
    echo "You suck at coding";
}

mysql_close();

?>

再说一次,我真的很新,所以如果你能像我 5 岁那样向我解释,那就太好了。

编辑:我用 myphpadmin gui 构建了表。

这些字段是:

id:INT,Primary,自动递增 first:varchar (50) last:varchar (50) phone:varchar (25)

EDIT2:按照 Esailija 的建议,我添加了 mysql_error() 函数。这是响应:“不正确的整数值:第 1 行的列 'id' 的''”

4

5 回答 5

2

尝试

$query = "INSERT INTO users (first, last, phone) VALUES ('$first', '$last', '$phone')";

...其中 first、last 和 phone 是表中字段的实际名称。

并且 +1 用于用 echo mysql_error() 替换 echo“你不擅长编码”。:)

于 2012-11-09T00:59:25.177 回答
0

我不太确定,因为您没有提供 mysql 表模式。

$query = "INSERT INTO users (first, last, phone)
          VALUES ('" . $first . "', '" . $last . "', '" . $phone . "')

如果您的id列设置为 INTEGER 而不是AUTO_INCREMENT,请确保在查询中插入正确的整数,即:

$id = 72;
$query = "INSERT INTO users VALUES ('" . $id . "', '" . $first . "', '" . $last . "', '" . $phone . "')

但如果是AUTO_INCREMENT,那么第一个代码应该没问题。

于 2012-11-09T00:57:00.367 回答
0

尝试

$query = "INSERT INTO users (`id`, `first`, `last`, `phone`) VALUES (NULL, '$first', '$last', '$phone')";

这是一个更完整的查询版本,包括要插入的列的名称。还要确保在添加到查询的字段中没有任何引号($first、$last、$phone)。

于 2012-11-09T00:59:12.253 回答
0

当您INSERT不指定字段时,MySQL 假定您按照声明它们的顺序插入所有字段。由于id是数字,因此不能设置为字符串。最佳做法是指定字段名称。例如,如果表格包含更多字段,它不会破坏您现有的代码。

还没有人说过(当我开始写这篇文章的时候)你的代码有一个可怕的 SQL 注入漏洞。坚持使用mysqlPHP 中的旧接口(不升级到mysqlior PDO),以下是您无需担心小 Bobby 表的方法:

<?php 
include "db-connect.php";

$query = sprintf(
  "INSERT INTO users (first, last, phone) VALUES ('%s', '%s', '%s')",
  mysql_real_escape_string($_POST['first']),
  mysql_real_escape_string($_POST['last']),
  mysql_real_escape_string($_POST['phone'])
);
$result = mysql_query($query);

if ($result) {
    echo 'Data entered "Successfully".';
} else {
    echo 'You suck at coding because: ', mysql_error();
}

?>

PS我也可以建议使用register_shutdown_function“db-connect.php”来关闭数据库连接吗?我还建议跟踪$cidmysql_connect(...).

于 2012-11-09T01:07:43.333 回答
0

您执行以下操作:

1) 忘记mysql_*函数并从一开始就以正确的方式对项目进行编码。任何教程或任何你正在浏览的东西都试图教你如何使用任何功能的 PHP+MySQL,这些功能都是从mysql_浏览器上的后退按钮开始的。任何新项目都应该使用 PDO 或 mysqli。PHP手册中有一个很大的红色警告,阻止您使用这些函数。它们将在 PHP 的未来版本中被删除,这是有充分理由的。而是使用PDOmysqli

2) 来自用户的任何变量都应被视为已污染。这包括$_POST变量。处理这个问题的最好方法是准备好的语句,这是它们的主要目的(而且它们对于多个查询也更快)。

// Connect to the DB substituting the values for your values:
$dbh = new PDO('mysql:host=localhost;dbname=your_database', $db_user, $db_password);

// Get PDO to display errors. You can comment this out for the live script
$dbh->setAttribute(PDO_ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION);

// Prepare the statement to be used during your query
$stmt = $dbh->prepare("INSERT INTO users (first, last, phone) VALUES ( :first , :last , :phone )");

// Bind the values to the prepared statement
$stmt->bindValue( ':first' , $first );
$stmt->bindValue( ':last' , $last );
$stmt->bindValue( ':phone' , $phone );

// Execute the query
$stmt->execute();

如果您希望优雅地处理产生的错误,这里的任何内容也可以包裹在 try-catch 块中。

于 2012-11-09T01:19:51.247 回答