如何在不知道当前值的情况下向php中的MySQL集合类型添加一个可能值
大家好,对不起我的英语 我有一个列“example”,它是集合类型。 我必须制作一个php页面,您可以在其中向该列添加值 首先,我需要知道“示例”中的内容,以防止控件添加现有值。其次,我需要添加新的值 这是我想做的如何在不知道当前值的情况下向php中的MySQL集合类型添加一个可能值,php,mysql,set,add,Php,Mysql,Set,Add,大家好,对不起我的英语 我有一个列“example”,它是集合类型。 我必须制作一个php页面,您可以在其中向该列添加值 首先,我需要知道“示例”中的内容,以防止控件添加现有值。其次,我需要添加新的值 这是我想做的 //I just made the connection to the db in PDO or MySQLi $newValue=$_POST['value']; //I take the value to add in the possible values from a for
//I just made the connection to the db in PDO or MySQLi
$newValue=$_POST['value']; //I take the value to add in the possible values from a form
//Now I have to "extract" all the possible values. Can't think how.
//I think I can store the values into an array
$result=$sql->fetch(); //$sql is the query to extract all the possible values from "example"
//So now i can do a control with a foreach
foreach($result as $control){
if ($newValue == $control){
//error message, break the foreach loop
}
}
//Now, if the code arrives here there isn't erros, so the "$newValue" is different from any other values stored in "example", so I need to add it as a possible value
$sql=$conn->query("ALTER TABLE 'TableName' CHANGE 'example' 'example' SET('$result', '$newValue')"); //<- where $result is the all existing possible values of "example"
//我刚刚在PDO或MySQLi中连接到数据库
$newValue=$_POST['value']//我从表单中获取要添加的可能值
//现在我必须“提取”所有可能的值。想不出怎么办。
//我想我可以将值存储到数组中
$result=$sql->fetch()//$sql是从“示例”中提取所有可能值的查询
//现在我可以用foreach做一个控件
foreach($结果为$控制){
如果($newValue==$control){
//错误消息,中断foreach循环
}
}
//现在,如果代码到达这里没有错误,那么“$newValue”与存储在“example”中的任何其他值都不同,因此我需要将其添加为可能的值
$sql=$conn->query(“ALTER TABLE'TableName'CHANGE'example'example'SET(“$result',“$newValue”)”)// 如果您需要一个集合类型-您应该知道您添加了哪些值。否则,只需使用VARCHARtype 我们可以通过查询信息\u schema.columns
假设该表在当前数据库中(并且假设我们在选择表名使用混合大小写时了解了小写\u table\u name
设置)
注意集合定义中允许的元素数量限制
从末尾删除结束部分,并附加',newval')
就我个人而言,我不太喜欢在应用程序代码中运行altertable
。这样做将在事务中执行隐式提交,并且在执行操作时还需要独占表/元数据锁。第一步是从PHP连接到数据库。您是在使用MySQLi还是PDO来实现这一点?我假设您没有使用常规MySQL,因为它可能已被弃用或删除,具体取决于您的PHP版本。到目前为止,你在这方面做过什么尝试吗?请更新您的问题,以显示您已经尝试过的内容,展示您的代码以及您在某个应用程序中面临的特定问题。这也有助于清楚地说明您正试图实现的目标,因为目前还不太清楚。我需要一个集合类型,我知道我添加的值,但不知道存储的值。我举了一个例子:“例子:{'Hello','World'};用户“Gianni”将“Fine”添加到集合中,因此:“示例”:{'Hello','World','Fine'};现在,另一个用户想要添加另一个值。我不知道具体哪些值在集合中,我无法控制和更新php页面每次只有几个问题。。。a) 通过information.schema,我可以得到该列的一组或所有配置的可能值?b) 我可以将结果放入数组中吗?c) 控件之后,如何将newValue放入列中?至少在概念上,我对ALTER TABLE的想法是正确的吗?a)这个问题中的查询返回一个字符串(VARCHAR),该字符串是列的列类型,它将出现在CREATE TABLE语句中。对于SET数据类型的列,您将返回类似于SET('apple','banana','cherry')
。(information_schema.columns中的其他列包含其他属性。)b)一旦我们从数据库返回字符串,我们就可以对它执行任何操作。c) 是的,ALTERTABLE语句将是我们更改列定义的方式。注意:在集合定义中,不要更改值的顺序。。。存储行引用集合列表中的位置OK,因此,如果返回值是varchar,它是:SET('apple','banana','cherry')
我可以使用字符串控件删除最后一个字符(“(”),然后使用查询“ALTER TABLE”TableName“CHANGE”example“example”。$return。“,$newValue”)代码>对吗?ALTER表应该包含完整的列定义,包括可空性、默认值、列注释等属性。在我将任何字符串包含到SQL语句的文本中之前,我会确保它可以安全地包含。。。白名单将被接受的值,通过一些检查验证它们,并正确地转义值。。。(考虑一个包含单引号的$newValue
,或单引号与逗号、括号的组合,例如“abc'der'p
”或例如“ab”“,”c”“)或“derp
”,因此,由于事情的复杂性,我采用了不同的方法来解决我的问题。谢谢你的帮助,不要怀疑,我会研究和学习这个东西的设置,以使用它在一个可能的未来。
SELECT c.column_type
FROM information_schema.columns c
WHERE c.table_schema = DATABASE()
WHERE c.table_name = 'TableName'
AND c.column_name = 'example'