如何使用php动态地将参数插入到mySQL数据库中?

时间:2017-01-26 16:00:23

标签: php mysql

我尝试将数据插入到mySQL表中,但我还不知道会有多少参数。

所以我需要找到一种如何动态插入参数的方法。

你可以这样做:

Insert into mytable (parameters) VALUES ('Ford;red;100kW;diesel;');
Insert into mytable (parameters) VALUES ('Ford;red;100kW;electric;40kWH');

因此,如果您需要添加电动汽车,则需要使用汽油车所不需要的千瓦时。

或者你这样做:

Insert into mytable(name, color, kW, engine) VALUES ('Ford', 'red', '100', 'diesel')

ALTER TABLE mytable ADD kWh VARCHAR( 255 ) after engine

Insert into mytable(name, color, kW, engine, kWh) VALUES ('Ford', 'red', '100', 'electric', '40')

在第一种情况下,您必须使用像explode这样的字符串操作来处理所有数据,在第二种情况下,您必须允许用户使用php添加列。

更好的方法是什么?还是有另一种方式更好吗?

我没有看到与其他问题有任何相似之处。

1 个答案:

答案 0 :(得分:0)

这是一个非常困难的问题。我希望我能正确理解。

免责声明

这是一篇长文章,可能包含错误。随时改正或要求澄清。 (由于问题的性质)它也基于某种观点。我试图平衡所有可能性。

我假设对此有一种面向对象的方法,即应该存储该对象。

TL; DR:最好不要以编程方式执行此操作。

评估

第一个答案的优点是,您可以在运行时拆分文本并动态创建一个新的Object,而这不会导致PDOException(或您使用的任何东西)。但是,这也有缺点。它可以导致您大量使用反射。为什么?如果您想在运行时更改表,我不得不假设您不知道期望使用哪种对象。这导致您“动态”创建那些对象。这也建议您应该以某种方式存储对象名称。

秒的答案提出了一个问题。您如何从该数据库中读取信息?

如果您动态读取该数据库(即以编程方式定义您将需要哪些列):您如何知道从哪个列读取?是什么确保您将存在这些列?您将必须check that the column you request exists。这可能很快就会变得混乱,因为您必须检查每一列。如果确实存在但未设置,则默认值为什么?

如果您静态地读取该数据库:为什么不事先设计数据库来保存kWh列?在某些时候它可能为null,但是您可以通过忽略它们来弥补这一点。

如果您事先知道要使用的对象,请设计数据库以使其能够容纳它。

另一种解决方法

  

还是还有另一种更好的方法?

您可能会很乐意使用Relational Databases并用Data Access Object来阻止那些人。即使此答案深入到设计方面,您也可能最好先设计应用程序。继续创建一个EER-Diagram,它代表您的数据结构。您可以拥有一个通用汽车实体,该实体由巡逻车和电动车(甚至是融合车)扩展。有很多工具可以帮助您创建这样的图表,并将其转换为您选择的数据库的DDL。

结论

具体来说,如果您确实必须在运行时更改表,我建议您使用第二种方法,并add a default value使用它。但是,根据您提出的问题,我真的无法看到您对此有所了解。这意味着您将要存储一个未知的对象。

如果是这种情况,为什么不使用对象名称创建一个新表,将对象的字段保存为列?这样一来,您便可以进行这样的访问(假设存储的存储对象是该对象):

$object = new TestObject();
repository->store($object);

在调用repository->store()时,存储库将检查数据库是否具有名为“ TestObject”的表,如果没有,则创建该表。如果创建了表,则可以继续对其进行更改并添加列。因此,以下将使用此代码:

$object = $repository->load("TestObject");

存储库现在将检查列TestObject,并可以在运行时像这样创建新的TestObject:

function load($name) {
    $returnValue = new $name;
    // Set the fields based on the database entries.
}

它具有很大的优势,您只需要检查表是否存在,并(如果是)创建一个新的Object或(如果不存在)抛出一个异常。

当然,这带来了更多的问题。为了简化操作,此处未进行错误处理(例如,名称空间会发生什么,如果有更多名称相同的对象会发生什么)。但这应该可以理解这一点。

对不起,很长的帖子,祝你愉快:)