无法使用PHP将大数组传递到mySQL数据库

无法使用PHP将大数组传递到mySQL数据库,php,mysql,Php,Mysql,我目前有一个相对较大的HTML表单(100多个字段)。我想从该表单中获取数据,并在使用点击submit时将其上传到mySQL数据库。我已经创建了下面的PHP代码,并一直在缓慢地添加字段和测试,以查看连接是否成功。一切都是通过$skilleed_护理工作的,但是当我添加下一组值时,我不再成功地创建数据库条目。我的所有echo命令都会显示,我的错误日志中没有出现故障,但数据库中没有接收到数据 有人能看出哪里出了问题吗?我已经检查了好几次拼写错误,但我没有看到任何错误。我想知道我是否在某种程度上与连接

我目前有一个相对较大的HTML表单(100多个字段)。我想从该表单中获取数据,并在使用点击submit时将其上传到mySQL数据库。我已经创建了下面的PHP代码,并一直在缓慢地添加字段和测试,以查看连接是否成功。一切都是通过$skilleed_护理工作的,但是当我添加下一组值时,我不再成功地创建数据库条目。我的所有echo命令都会显示,我的错误日志中没有出现故障,但数据库中没有接收到数据

有人能看出哪里出了问题吗?我已经检查了好几次拼写错误,但我没有看到任何错误。我想知道我是否在某种程度上与连接超时,或者我是否试图在execute命令中插入太多的值

<?php

echo 'started ok';
// configuration
$dbtype     = "mysql";
$dbhost     = "localhost";
$dbname     = "dbname";
$dbuser     = "dbuser";
$dbpass     = "userpass";
echo 'variables assigned ok';
// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
echo 'connection established';
// new data
$facility_name = $_POST['facility_name'];
$facility_street = $_POST['facility_street'];
$facility_county = $_POST['facility_county'];
$facility_city = $_POST['facility_city'];
$facility_state = $_POST['facility_state'];
$facility_zipcode = $_POST['facility_zipcode'];
$facility_phone = $_POST['facility_phone'];
$facility_fax = $_POST['facility_fax'];
$facility_licensetype = $_POST['facility_licensetype'];
$facility_licensenumber = $_POST['facility_licensenumber'];
$facility_email = $_POST['facility_email'];
$facility_administrator = $_POST['facility_administrator'];
$skilled_nursing = $_POST['skilled_nursing'];
$independent_living = $_POST['independent_living'];
$assisted_living = $_POST['assisted_living'];
$memory_care = $_POST['memory_care'];
$facility_type_other = $_POST['facility_type_other'];
$care_ratio = $_POST['care_ratio'];
$nurse_ratio = $_POST['nurse_ratio'];



// query
$sql = "INSERT INTO Facilities (facility_name, facility_street, facility_county, facility_city, facility_state, facility_zipcode, facility_phone, facility_fax, facility_licensetype, facility_licensenumber, facility_email, facility_administrator, skilled_nursing, independent_living, assisted_living, memory_care, facility_type_other, care_ratio, nurse_ratio) VALUES (:facility_name, :facility_street, :facility_county, :facility_city, :facility_state, :facility_zipcode, :facility_phone, :facility_fax, :facility_licensetype, :facility_licensenumber, :facility_email, :facility_administrator, :skilled_nursing, :independent_living, :assisted_living, :memory_care, :facility_type_other, :care_ratio, :nurse_ratio)";
$q = $conn->prepare($sql);
$q->execute(array(':facility_state'=>$facility_name,
':facility_street'=>$facility_street,
':facility_county'=>$facility_county,
':facility_city'=>$facility_city,
':facility_state'=>$facility_state,
':facility_name'=>$facility_name,
':facility_zipcode'=>$facility_zipcode,
':facility_phone'=>$facility_phone,
':facility_fax'=>$facility_fax,
':facility_licensetype'=>$facility_licensetype,
':facility_licensenumber'=>$facility_licensenumber,
':facility_email'=>$facility_email,
':facility_administrator'=>$facility_administrator,
':skilled_nursing'=>$skilled_nursing,
':independent_living'=>$independent_living,
':assisted_living'=>$assisted_living,
':memory_care'=>$memory_care,
':facility_type_other'=>$facility_type_other,
':care_ratio'=>$care_ratio,
':nurse_ratio'=>$nurse_ratio));

echo 'query parsed';

?>

这并不能准确地回答代码的问题,但可能有助于解决问题

我会做得有点不同。你说你有很多领域。您的代码可能会变得很长且重复。由于您的表单字段名似乎已经与表列对应,因此我将执行类似的操作(未测试):

这样,您就可以有10个、100个或1000个字段,而这段代码根本不需要更改。您还可以减少键入错误的机会,因为只有一个地方指定了列名。您不必担心列名上的SQL注入,因为在允许在查询中使用该列之前,您需要检查以确保该列存在


当然,这假定通过
$\u POST
传入的所有字段都与表中的列名对应。如果不是这种情况,则最简单的方法是只存储那些不是单独变量列的特定字段值,然后从
$\u POST
数组中
unset()
将它们存储起来。

检查$conn->errorInfo()的内容;[感谢您的回复。errorInfo()返回:'Array([0]=>00000)'从您发布的文章中,我相信0意味着成功的连接。滑稽的是,这太棒了!它节省了我太多的重复,并消除了不匹配的行。我在您的unset命令下面添加了echo$key;,以帮助我查找拼写错误,但在其他方面能够按原样实现。非常感谢您!很高兴听到它对您有效。离开即使在调试完成后,也要在那里签入
unset()
列。这会阻止SQL注入。其他人可能会编写一个脚本,将其发布到您的PHP页面,因此您不能相信列名将是您在表单中指定的列名。
// get a list of column names that exist in the table
$sql = "SELECT column_name FROM information_schema.columns WHERE table_name = 'Facilities'";
$q = $conn->prepare($sql);
$q->execute();
$columns = $q->fetchAll(PDO::FETCH_COLUMN, 0);

$cols = array();
foreach ($_POST as $key=>$value)
{
    // if a field is passed in that doesn't exist in the table, remove it
    if (!in_array($key, $columns)) {
        unset($_POST[$key]);
    }
}

$cols = array_keys($_POST);
$sql = "INSERT INTO Facilities(". implode(", ", $cols) .") VALUES (:". implode(", :", $cols) .")";
$q = $conn->prepare($sql);
array_walk($_POST, "addColons");
$q->execute($_POST);

function addColons($value, &$key)
{
    $key = ":{$key}";
}