我尝试将数据插入到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添加列。
更好的方法是什么?还是有另一种方式更好吗?
我没有看到与其他问题有任何相似之处。
答案 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或(如果不存在)抛出一个异常。
当然,这带来了更多的问题。为了简化操作,此处未进行错误处理(例如,名称空间会发生什么,如果有更多名称相同的对象会发生什么)。但这应该可以理解这一点。
对不起,很长的帖子,祝你愉快:)