使用变量列名更新mysql表

时间:2015-10-27 21:32:34

标签: php mysql

我一直在尝试使用变量作为列名来更新mysql表中列的值,但它不起作用。当我没有使用列名作为变量时,它起作用了。但我希望列名称是动态的。以下是我的代码。提前致谢

$type = $_POST['message_type'];
$message_id = $_POST["message_id"];
$txtmessage = $_POST["txtmessage"];
  if(!empty($_POST["message_id"]) && !empty($_POST["txtmessage"]) && !empty($_POST["message_type"])) {
    $result = mysqli_query($conn,"UPDATE form SET $type = '$txtmessage' WHERE  id='$message_id'"); 
  }

以下是完整的代码,以便您了解我正在尝试做什么并帮助我做得更好。

Html代码:

<tr>
  <td><label>Surname:</label></td>
  <td>
    <div class="message-box" id="message_<?php echo $formdata["regformid"];?>">
      <span class="message-content"><?php echo $formdata["surname"]; ?></span> 
      <button class="btnEditAction" name="edit" onClick="showEditBox(this,<?php echo $formdata["regformid"]; ?>,'surname')">
        Edit
      </button>
    </div>
  </td>
</tr>

脚本

function showEditBox(editobj,id,type) {
    $('#frmAdd').hide();
    $(editobj).prop('disabled','true');
    var currentMessage = $("#message_" + id + " .message-content").html();
    var editMarkUp = '<input size="10" id="txtmessage_'+id+'" placeholder="'+currentMessage+'" /><button name="save" onClick="callCrudAction('+id+','+type+')">Save</button><button name="cancel" onClick="cancelEdit(\''+currentMessage+'\','+id+')">Cancel</button>';
    $("#message_" + id + " .message-content").html(editMarkUp);
}
function cancelEdit(message,id) {
    $("#message_" + id + " .message-content").html(message);
    $('#frmAdd').show();
}
function callCrudAction(id,type) {
    var queryString;
    queryString = 'message_id='+id+'&message_type='+type+'&txtmessage='+ $("#txtmessage_"+id).val();

    jQuery.ajax({
    url: "action.php",
    data:queryString,
    type: "POST",
    success:function(data){
        $("#message_" + id + " .message-content").html(data);
        $('#frmAdd').show();
        $("#message_"+id+" .btnEditAction").prop('disabled','');    

        $("#txtmessage").val('');
        $("#loaderIcon").hide();
    },
    error:function (){}
    });
}

action.php的

$type = $_POST['message_type'];
$message_id = $_POST["message_id"];
$txtmessage = $_POST["txtmessage"];
if(!empty($_POST["message_id"]) && !empty($_POST["txtmessage"]) && !empty($_POST["message_type"])) {
    //$result = mysqli_query($conn,"UPDATE regform SET `$type` = '$txtmessage' WHERE  regformid='$message_id'");

    $result = mysqli_query($conn, 'UPDATE regform SET `' . $type . '` = "' . $txtmessage . '" WHERE regformid=' . $message_id. '');

    //$result = mysqli_query($conn,"UPDATE regform SET " . mysqli_real_escape_string($conn, $type) . ' = ' . mysqli_real_escape_string($conn, $txtmessage) . " WHERE regformid='$message_id'");
    if($result){
          echo $_POST["txtmessage"];
    }
    if (!$result) {echo mysqli_error($conn);}

}

MySQL的:

CREATE TABLE IF NOT EXISTS `regform` (
  `regformid` int(11) NOT NULL AUTO_INCREMENT,
  `surname` varchar(200) NOT NULL,
  `firstname` varchar(200) NOT NULL,
  `middlename` varchar(200) NOT NULL,
  `reg_no` varchar(20) NOT NULL,
  PRIMARY KEY (`regformid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=80 ;

1 个答案:

答案 0 :(得分:0)

我会使用以下代码来执行sql语句。 mysqli_real_escape_string($ conn,...)调用确保变量1)的内容不会损害您的数据库,2)防止由message和messageid引起的意外语法错误。由于您使用用户输入来确定列名称,因此您必须小心$ type varia中的内容。我要么不直接从用户输入中获取列名(使用let&#39; s说出用户输入中的数字,并使用php中的数组将数字与字段名称匹配),或者我将验证名称使用information_schema.columns表的列。

$result = mysqli_query($conn, "UPDATE regform SET `" . mysqli_real_escape_string($conn,$type) . "` = '" . mysqli_real_escape_string($conn,$txtmessage) . "' WHERE regformid='" . mysqli_real_escape_string($conn,$message_id). "'");