我正在尝试检查表中是否有某个列,如果没有将该列添加到其中。只要输入值没有@符号,我的代码似乎工作正常。我试过周围 “$电子邮件” 使用和不使用单引号作为输入字符串。任何帮助都会非常感激。
$email = strtolower(mysql_real_escape_string($_SESSION['email']));
$result = mysql_query("SHOW COLUMNS FROM `selections` LIKE '$email'",$conn);
$exists = (mysql_num_rows($result))?TRUE:FALSE;
if ($exists == FALSE) {
$query2 = "ALTER TABLE selections ADD $email VARCHAR( 120 ) NOT NULL";
$add= mysql_query($query2,$conn);
var_dump($query2);
echo("this error". mysql_error());
}
$ query2直接来自phpmyadmin,即使使用@符号输入
也似乎在那里工作感谢您的帮助!
答案 0 :(得分:3)
首先,请 考虑以另一种方式执行此操作。您将为每个电子邮件向表中添加一个字段 - 您可能不知道的是,这会通过增加行的大小来增加表的大小,并且还会限制您到固定数量的字段({{3清楚地突出显示每行最多65535个字节。每个VARCHAR字符,取决于charset,在3到8个字节之间)
您的请求失败的真正原因是因为@
是SQL查询中的特殊字符,而phpmyadmin恰好足以逃脱它。 @
表示MySQL使用的SQL方言中的变量。你可以为MySQL调用它的反引号 - 或者你可以退出使用它来支持这样的表结构:
selection:
* id
* your metadata here
emails:
* id
* email_address
selection_emails:
* id
* selection_id
* email_id
第三个表称为关联表。它允许您继续规范化数据。
答案 1 :(得分:0)
您可以用大括号{$email}
包围电子邮件,将其明确定义为字符串中的变量,但在此之前您可能还需要在此变量中转义奇数字符。
当改变表格时,你也应该用反向标记围绕它,以允许奇数字符。
最好的方法是使用参数化查询,然后删除DEPRECATED mysql库。并且不允许在字段名称中使用奇数字符。
我还会质疑为什么要将电子邮件添加为新列。