PHP、MySQL在localhost中插入到表中

PHP、MySQL在localhost中插入到表中,php,mysql,insert,Php,Mysql,Insert,我对MySQL和PHP非常陌生,在插入到表中时遇到了一些小问题 我已经构建了包含所有MySQL代码的“setup.php”,但我不知道如何正确地包含到“index.php”中 我尝试按如下方式分离代码,但仍然不起作用。我不知道这里有什么问题,是代码本身吗?还是我把它包括进去的方式?请帮我修一下 php,代码就在body元素之后 if (isset($_POST['name']) && isset($_POST['email']) && isset($_POST

我对MySQL和PHP非常陌生,在插入到表中时遇到了一些小问题

  • 我已经构建了包含所有MySQL代码的“setup.php”,但我不知道如何正确地包含到“index.php”中
  • 我尝试按如下方式分离代码,但仍然不起作用。我不知道这里有什么问题,是代码本身吗?还是我把它包括进去的方式?请帮我修一下
php,代码就在body元素之后

if (isset($_POST['name']) &&
isset($_POST['email']) &&
isset($_POST['place']) &&
isset($_POST['level'])) {

include "setup.php";

$name =      sanitizeString($_POST['name']);
$email =     sanitizeString($_POST['email']);
$place =   sanitizeString($_POST['place']);
$level =     sanitizeString($_POST['level']);

$query = "INSERT INTO customers VALUES('$name', '$email', '$place', '$level')";
queryMysql($query);

}
setup.php

<?php
$dbhost = 'localhost';
$dbname = 'applicants';
$dbuser = 'root';
$dbpass = 'root';

mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());

function createTable($name, $query) {
    if (tableExists($name)) {
        echo "Table $name already exists";
    }
    else {
        queryMysql("CREATE TABLE $name($query)");
    }
}

function tableExists($name) {
    $result = queryMysql("SHOW TABLES LIKE $name");
    return mysql_num_rows($result);
}

function queryMysql($query) {
    $result = mysql_query($query);
    return $result;
}

createTable('customers',
            'name VARCHAR(16),
            email VARCHAR(16),
            place VARCHAR(16),
            level VARCHAR(16)');    

在index.php中,查询应该是

mysql_query($query)
不是queryMysql

另外,请确保插入数据库中的每个字段。如果有自动递增字段或未使用的字段,请使用此语法

INSERT INTO products (column 1, column 2) VALUES (value1, value2) 

p、 将您的所有queryMysql更改为mysql\u query()。我相信没有像queryMysql这样的函数(我很久以前就停止使用这个mysql函数了,所以我可能是错的,但是关于mysql\u query(),我确信它会工作)

使用PDO是一种更好的方法:

您有一个充当连接的PDO对象,然后将其传递给函数以进行操作

要点
  • PDO支持预先准备好的语句,这样就不需要进行清理(预先准备好的语句会为您做这件事!)
  • 插入时,明确声明哪个列得到什么被认为是一种良好的做法,我假定了列的名称,但是如果它们不匹配,您应该更改它们
  • 不要回显,抛出异常。抛出异常可以让您更高效、更轻松地处理代码中的问题和错误。您抛出异常并在可能发生的地方捕获它。未捕获(
    catch
    ed)异常将终止脚本

定义“不起作用”。你有错误吗?发生了什么或没有发生什么?表中不会插入任何内容。然而,我没有得到任何错误。怎么了?使用PDO,这是一个更好的方法。仍然并没有任何东西可以插入到表中。queryMysql是我在setup.php中编写的一个函数!我认为它会起作用?你的代码有很多问题。通过错误报告(-1)打开错误报告;在你剧本的开头。并在更改后更新脚本。请将所有queryMysql更改为mysql\u query()。另外,告诉我们POST变量来自何处。输入的索引和名称是否相同?“…无需“清理”然而,这也增加了绑定的必要性。那有什么好处呢?;-)嗯,你可以绑定一个参数一次,然后更改参数并再次执行,而无需重新绑定/重新初始化。呃,恐怕你有点困惑:)我很好奇,你自己使用过这样的功能吗?当然,在插入大量行时,使用事务和参数绑定非常方便,而且非常高效。啊,对当绑定变量而不是值时,似乎不必重新绑定它们。我的错。然而,我看不出有什么好处,因为这样的大容量插入肯定是在循环中完成的,所以,与转义没有多大区别。
function validatePost($post) {
    return (isset($post['name']) &&
        isset($post['email']) &&
        isset($post['place']) &&
        isset($post['level']));
}

function createTable(PDO $pdo, $name, $query) {
    if (tableExists($pdo, $name)) {
        throw new Exception("Table already exists");
    }
    $pdo->query("CREATE TABLE $name($query)");
}

function tableExists(PDO $pdo, $name) {
    $result = $pdo->query("SHOW TABLES LIKE $name");
    return count($result->fetchAll());
}

$dbhost = 'localhost';
$dbname = 'applicants';
$dbuser = 'root';
$dbpass = 'root';

validatePost($_POST);
try {
    $pdo = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    createTable($pdo, "customers",
        "name VARCHAR(16),
         email VARCHAR(16),
         place VARCHAR(16),
         level VARCHAR(16)");

    $stmt = $pdo->prepare("INSERT INTO `customers` (`name`, `email`, `place`, `level`) VALUES(:name, :email, :place, :level)");
    $stmt->bindParam(":name", $_POST["name"]);
    $stmt->bindParam(":email", $_POST["email"]);
    $stmt->bindParam(":place", $_POST["place"]);
    $stmt->bindParam(":level", $_POST["level"]);
    $stmt->execute();
}
catch (PDOException $e) {
    echo "There was an error regarding the Database: " . $e->getMessage();
    die();
}
catch (Exception $e) {
    echo "Error! " . $e->getMessage();
}