检查是否存在mysql字段,如果不存在则创建

时间:2013-01-31 10:41:02

标签: mysql field alter

我正在实施geonames webservice,如下所示:

$( "#loc_from" ).autocomplete({
    source: function( request, response ) {
        $.ajax({
            url: "http://ws.geonames.org/searchJSON",
            dataType: "jsonp",
            data: {
                featureClass: "P",
                style: "full",
                maxRows: 12,
                name_startsWith: request.term,
                searchlang: 'ES'
            },
            success: function( data ) {
                response( $.map( data.geonames, function( item ) {
                    item.label = item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName;
                    return item;
                }));
            }
        });
    },
    minLength: 2,
    select: function( event, ui ) {
         ui.item.task = 'new_city';
         $.post('/includes/router.php', ui.item , function(){

         });
         $('#id_loc').val(ui.item.gid);
         //alert(ui.item.gid);
    }
});

在router.php中我有:

case 'new_city':
    /* comprobar si exite */
    $query = "SELECT geonameid FROM geonames";
    if(count(cache_query($query))>0){
        /* Its already in my database */
    }else{
        foreach ($_POST as $key => $value) {
                    check_field($key);
            echo $key.': '.$value.'<br>';
        }
    }
    /* si no existe, dar de alta*/
    break;

所以我希望函数check_field($key)检查geonames。$ key字段是否存在并更改表并添加它。

这是可能的吗? (另外,你推荐这个吗?)

3 个答案:

答案 0 :(得分:1)

我认为你正在寻找这个

SELECT * 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'db_name' 
AND TABLE_NAME = 'geonames' 
AND COLUMN_NAME = 'column_name'

从PHP可以做到这一点

function add_column_if_not_exist($db, $column, $column_attr = "VARCHAR( 255 ) NULL" ){
    $exists = false;
    $columns = mysql_query("show columns from $db");
    while($c = mysql_fetch_assoc($columns)){
        if($c['Field'] == $column){
            $exists = true;
            break;
        }
    }      
    if(!$exists){
        mysql_query("ALTER TABLE `$db` ADD `$column`  $column_attr");
    }
}

答案 1 :(得分:1)

回答你的一个问题:动态扩展表永远不是一个好主意。

保持表静态的一个好方法是使用查找表。

例如:

表1包含字段:

id, name

表2包含字段:

id, name_of_dynamically_added_item

查找表如下所示:

id, id_table1, id_table2

您可以向table2添加一行,而不是向任何表添加列。 对于应链接到table1中的行的每个项目,可以向查找表中添加一行。

这样你就永远不会创建一个具有不可预见数量的列的表。此外,您将不会有大多数填充NULL值的行。

答案 2 :(得分:0)

$sql= "SELECT * FROM users WHERE id='1'";
$query = mysqli_query($conn, $sql);
$row=mysqli_fetch_array($query, MYSQL_ASSOC);
if($row['id']=="" || NULL){
echo "id=5 do not exits";
//then create one
}
else{
echo "user exist";
}