我想将php代码中的成员插入到mysql数据库中,它会自动增加但没有添加数据

时间:2015-12-02 14:34:44

标签: php mysql database insert

我试图将用户从我的PHP页面插入我的数据库表用户(membros),但由于某种原因,它会增加值#34; membro_id)这是主键,但没有数据添加到它。我的页面有一般标题。主要是:

<?php
define('DB_USER', 'chimasonline');
define('DB_PWD', 'root');
define('DB_NAME', 'chimasonline');
define('DB_HOST', 'localhost');
define('DB_DSN', 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME);

我的模型成员文件是Member.php(我在评论模式中放置INSERT INTO查询以显示我已经尝试过的内容):

<?php
// PHP and MySQL Project
// members table data class

class Members
{
    public $debug = TRUE;
    protected $db_pdo;
    public $membersPerPage = 12;
    public $howManyMembers = 0;

    /*
     * Returns array of arrays where each sub-array = 1 database row of Members
     * @param int $offset [optional]
     * @return array $row[] = array('title' => title, 'description' => description, etc.)
     */
    public function getAllMembers($offset = 0)
    {
        $pdo = $this->getPdo();
        $sql = 'SELECT * FROM `membros` ORDER BY `primeironome` LIMIT ' . $this->membersPerPage . ' OFFSET ' . $offset;
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $content = array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $content[] = $row;
        }
        return $content;
    }
    /*
     * Returns database row for 1 member
     * @param int $id = member ID
     * @return array $row[] = array('title' => title, 'description' => description, etc.)
     */
    public function getDetailsById($id)
    {
        $pdo = $this->getPdo();
        $sql = 'SELECT * FROM `membros` WHERE `produto_id` = ?';
        $stmt = $pdo->prepare($sql);
        $stmt->execute(array($id));
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        return $result;
    }
    /*
     * Returns database row for 1 member
     * @param string $email
     * @return array $row[] = array('title' => title, 'description' => description, etc.)
     */

      public function insertMember($data)
    {
        $pdo = $this->getPdo();


/*      $sql = 'INSERT * INTO `membros`(`nome`, `endereco`, `cidade`, `estado_provincia`, 
       `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`)' . 'VALUES ([value-2],[value-3],
       [value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10],[value-11])';

    /*            $sql = 'INSERT INTO `membros`( `nome`, `endereco`, `cidade`, `estado_provincia`, 
       `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`)' . 'VALUES ([value-2],[value-3],
       [value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10],[value-11])';

  /*             $sql = 'INSERT INTO dbname . `membros`(`nome`, `endereco`, `cidade`, `estado_provincia`, 
       `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`)' . 'VALUES ([value-2],[value-3],
       [value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10],[value-11])';
 */ 
 /*
                $sql = 'INSERT INTO `membros`(`primeironome`, `ultimonome`, `endereco`, `cidade`, 
 `provincia`, `codigopostal`, `pais`, `telefone`, `email`)'
. 'VALUES (:primeironome,:ultimonome,:endereco,:cidade,:provincia,:codigopostal,
 :pais,:telefone,:email)';





    /*             $sql = 'INSERT INTO `chimasonline`.`membros` (`nome`, `endereco`, `cidade`, `estado_provincia`, `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`)'
       . 'VALUES (:pimeironome, :endereco, :cidade, :provincia, :codigopostal, :pais, :telefone, :balanco, :email, :password);';


                 $sql = 'INSERT INTO `membros` (`nome`, `endereco`, `cidade`, `estado_provincia`, `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`)'
       . 'VALUES (:nome, :endereco, :cidade, :estado_provincia, :codigo_postal, :pais, :telefone, :balanco, :email, :password);';


                 $sql = 'INSERT INTO `chimasonline`.`membros` (`nome`, `endereco`, `cidade`, `estado_provincia`, `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`) 
         ' . 'VALUES (primeironome ,endereco ,cidade ,provincia ,codigopostal ,pais , telefone,balanco ,email,password )';

      $sql = 'INSERT INTO `membros`(`nome`, `endereco`, `cidade`, `estado_provincia`, 
     `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`) VALUES = ?';   


  funcionou melhor esses dois tenho que explorar mais  lembrar q n tinha parametro    
        $sql = 'INSERT INTO `chimasonline`.`membros` ( `primeironome`, `ultimonome`, `endereco`, `cidade`, 
            `provincia`, `codigopostal`, `pais`, `email`, `telefone`, `password`) 
  . 'VALUES ( :primeironome ,:ultimonome, :endereco , :cidade , :provincia, :codigopostal , :pais , :email, :telefone, :password)';'  


   $sql = 'INSERT INTO `chimasonline`.`membros` ( `nome`, `endereco`, `cidade`, `estado_provincia`, `codigo_postal`, `pais`, `password`) 
  VALUES ( hdd, f, bll, bgrio, 00000, qrf, password)'; 


       // $sql = 'INSERT INTO `chimasonline`.`membros` (`nome`, `endereco`, `cidade`, `estado_provincia`, `codigo_postal`, `pais`, `telefone`, `balanco`, `email`, `password`) 
         ' . 'VALUES ( )';  

             $sql  = 'INSERT INTO `membros`(`primeironome`, `ultimonome`, `endereco`, `cidade`, `provincia`, 
             `codigopostal`, `pais`, `password`)' . 'VALUES ( ?,?,?,?,?,?,?,?,?,?);';

           */     
        $stmt = $pdo->prepare($sql);


               $stmt->execute(array($data));
        $result = $stmt->fetch(PDO::FETCH_ASSOC);



                 return $result;

    } 
    /*
     * Returns database row for 1 member
     * @param string $email
     * @return array $row[] = array('title' => title, 'description' => description, etc.)
     */




    public function loginByName($email, $password)
    {
        $pdo = $this->getPdo();
        $sql = 'SELECT * FROM `membros` WHERE `email` = ? AND `password` = ?';
        $stmt = $pdo->prepare($sql);
        $stmt->execute(array($email, $password));
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        return $result;
    }
    public function getHowManyMembers()
    {
        if (!$this->howManyMembers) {
            $pdo = $this->getPdo();
            $sql = 'SELECT COUNT(*) FROM `membros`';
            $stmt = $pdo->prepare($sql);
            $stmt->execute();
            // fetches as a numeric array
            $result = $stmt->fetch(PDO::FETCH_NUM);
            $this->howManyMembers = $result[0];
        }   
        return $this->howManyMembers;
    }
    /*
     * Returns array of arrays where each sub-array = 1 database row of Members
     * Searches name, address, city, state_province, country, email
     * @param string $search
     * @return array $row[] = array('title' => title, 'description' => description, etc.)
     */
    public function getMembersByKeyword($search)
    {
        $search = strip_tags($search);
        $search = str_ireplace(array("'",'-','"',';'), '', $search);
        $search = "'%" . $search . "%'";
        $pdo = $this->getPdo();
        $sql = 'SELECT * FROM `membros` WHERE '
              . '`primeironome` LIKE ' . $search . ' OR '
              . '`cidade` LIKE ' . $search . ' OR '
              . '`email` LIKE ' . $search . ' ORDER BY `primeironome`';


        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        $content = array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $content[] = $row;
        }
        return $content;
    }
    /*
     * Returns a safely quoted value
     * @param string $value
     * @return string $quotedValue
     */
    public function pdoQuoteValue($value)
    {
        $pdo = $this->getPdo();
        return $pdo->quote($value);
    }
    /*
     * Returns a PDO connection
     * If connection already made, returns that instance
     * @return PDO $pdo
     */
    public function getPdo()
    {
        if (!$this->db_pdo) {
            if ($this->debug) {
                $this->db_pdo = new PDO(DB_DSN, DB_USER, DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
            } else {
                $this->db_pdo = new PDO(DB_DSN, DB_USER, DB_PWD);
            }
        }
        return $this->db_pdo;
    }       

}

我的addmember文件(adicionarmembro.php)是:

?php
// assign defaults
//$result='';
$mailStatus = '';
$data = array('email'       => 'email', 
              'primeironome'    => 'primeironome', 
              'ultimonome'  => 'ultimonome', 
              'endereco'    => 'endereco', 
              'cidade'      => 'cidade', 
              'provincia'       => 'provincia', 
                          'codigopostal'    => 'codigopostal', 
                          'pais'        => 'pais',    
              'telefone'    => 'telefone',
                 // 'password'  => 'password',
                          //'password_confirmacao'  => 'password_confirmacao',
             // 'dnano'     => 0,
             // 'dnmes' => 0,
            //  'dndia'     => 0,
                 // 'dn'        => 0,
);
$error = array('email'    => '', 
              'primeironome' => '', 
              'ultimonome'  => '', 
              'endereco'      => '', 
              'cidade'    => '', 
                  'provincia'     => '',
              'codigopostal'  => '', 
                          'pais'      => '', 
              'telefone' => '', 
              'dn'        => '',
);
if (isset($_POST['data'])) {
    $data = $_POST['data'];
    foreach ($data as $key => $value) {
        $data[$key] = strip_tags($value);
    }
    if (isset($data['dnano']) && isset($data['dnmes']) && isset($data['dndia'])) {
        try {
            $bdateString = sprintf('%4d-%02d-%02d', $data['dnano'], $data['dnmes'], $data['dndia']);
            $bdate = new DateTime($bdateString);
            $today = new DateTime();
            $interval16 = new DateInterval('P16Y');
            $bdate16 = $today->sub($interval16);
            if ($bdate > $bdate16) $error['dn'] = '<b class="error">Tem que ter pelo menos 16 anos!</b>';
        } catch (Exception $e) {
            $error['dn'] = '<b class="error">Data invalida</b>';
            echo $e->getMessage();
            exit;
        }

    } else {
        $error['dn'] = '<b class="error">Data invalida</b>';
    }
    if (!preg_match('/^[a-z][a-z0-9._-]+@(\w+\.)+[a-z]{2,6}$/i', $data['email'])) {
        $error['email'] = '<b class="error">endereco de email Invalido</b>';
    }
    if (!preg_match('/^[a-z0-9,. ]+$/i', $data['primeironome'])) {
        $error['primeironome'] = '<b class="error">O nome deve apenas conter letras, numeros, espacos "," ou "."</b>';
    }
    if (!preg_match('/[a-z0-9,. ]/i', $data['ultimonome'])) {
        $error['ultimonome'] = '<b class="error">O nome deve apenas conter letras, numeros, espacos "," or "."</b>';
    }
    if (!preg_match('/[a-z0-9,. ]/i', $data['endereco'])) {
        $error['endereco'] = '<b class="error">O endereco deve apenas conter letras, numeros, espacos "," ou "."</b>';
    }
    if (!preg_match('/[a-z0-9,. ]/i', $data['cidade'])) {
        $error['cidade'] = '<b class="error">A cidade deve apenas conter letras, numeros, espacos "," ou "."</b>';
    }
        if (!preg_match('/[a-z0-9,. ]/i', $data['provincia'])) {
        $error['provincia'] = '<b class="error">A provincia deve apenas conter letras, numeros, espacos "," ou "."</b>';
    }
    if (!preg_match('/^[a-z][0-9][a-z] [0-9][a-z][0-9]$|^\d{5}(-\d{4})?$/i', $data['codigopostal'])) {
        $error['codigopostal'] = '<b class="error"> codigo postal de Canada: A9A 9A9 <br />codigo postal de US: 99999 or 99999-9999<br />Se seu pais nao tem codigo postal digite 00000</b>';
        }
    if (!preg_match('/[a-z0-9,. ]/i', $data['pais'])) {
        $error['pais'] = '<b class="error">O pais deve apenas conter letras, numeros, espacos "," ou "."</b>';
    }
    if (!preg_match('/^\+[0-9]{1,3} \d{3}-\d{3}-\d{4}/', $data['telefone'])) {
        $error['telefone'] = '<b class="error">O numero do telephone deve star no formato +CC AAA-CCC-DDDD</b>';
    }
    // Verifica se o formulario e valido
    $isValid = TRUE;
    foreach ($error as $value) {
        if ($value) {
            $isValid = FALSE;
            break;
        }
    }

                  if ($isValid) {
        require_once('PHPMailer/class.phpmailer.php');
                require './Model/Members.php';
                  $memberTable = new Members();
        $address = "****@****.com";
        $newName = $data['primeironome'] . ' ' . $data['ultimonome'];
        $mail = new PHPMailer(); // defaults to using php "mail()"
        $body = 'Seja bemvindo a Chimas Online ' . $newName . '!'
              . '<br />Para confirmar o seu email, apenas responde a este email e nos faremos o resto...'
              . '<br />Desfrute!'
                          . '<br /> Clique em <a href = www.irenejovem.com> e continue a explorar os nossos produtos www.irenejovem.com';
        $mail->AddReplyTo($address,"ChimasOnline");
        $mail->SetFrom($address,"ChimasOnline");
        $mail->AddAddress($data['email'], $newName);
        $mail->Subject = 'Confirmacao de novo membro da ChimasOnline';
        $mail->AltBody = "Para ver a mensagem, use por favor um visualizador de email HTML compativel!"; // optional, comment out and test
        $mail->MsgHTML($body);
        if(!$mail->Send()) {
          $mailStatus = 'Erro ao enviar o email: ' . $mail->ErrorInfo;
        } else {
          $mailStatus = 'Email de confirmacao Enviado! Verifique o seu email e clique no link de confirmacao para efectivar o seu registro!';


                  $result = $memberTable->insertMember($data);


                }
    }
}
?>
    <div class="content">
    <br/>
    <div class="product-list">

        <h2>Cadastre-se na nossa pagina</h2>
        <br/>

        <b>Por favor, preencha a sua informacao.</b>
        <br/>
        <br/>
        <?php if ($mailStatus) echo '<br /><b class="confirm">', $mailStatus, '</b><br />'; ?>
        <br />
        <form action="?page=adicionarmembro" method="POST">
            <p>
                <label>Data de Nascimento: </label>
                <select name="data[dnano]">
                    <?php if ($data['dnano']) { echo '<option>', $data['dnano'], '</option>'; } ?>
                    <?php $year = date('Y'); ?>
                    <?php for($x = $year; $x > ($year - 120); $x--) { ?>
                        <option><?php echo $x; ?></option>
                    <?php }     ?>
                </select>
                <select name="data[dnmes]">
                    <?php   
                    $month = array(1 => 'Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez');
                    if ($data['dnmes']) { 
                        printf('<option value="%02d">%s</option>', 
                               $data['dnmes'], $month[(int) $data['dnmes']]);
                    } 
                    for($x = 1; $x <= 12; $x++) {
                        printf('<option value="%02d">%s</option>', $x, $month[$x]);
                        echo PHP_EOL;
                    }       
                    ?>
                </select>
                <select name="data[dndia]">
                    <?php if ($data['dndia']) { echo '<option>', $data['dndia'], '</option>'; } ?>
                    <?php for($x = 1; $x < 32; $x++) { ?>
                        <option><?php echo $x; ?></option>
                    <?php }     ?>
                </select> 

                <?php if ($error['dn']) echo '<p>', $error['dn']; ?>
            <p>
                <label>Email: </label>
                <input type="text" name="data[email]" value="<?php echo htmlspecialchars($data['email']); ?>" />
                <?php if ($error['email']) echo '<p>', $error['email']; ?>
            <p>
            <p>
                <label>Primeiro Nome: </label>
                <input type="text" name="data[primeironome]" value="<?php echo $data['primeironome']; ?>" />
                <?php if ($error['primeironome']) echo '<p>', $error['primeironome']; ?>
            <p>
            <p>
                <label>Ultimo Nome: </label>
                <input type="text" name="data[ultimonome]" value="<?php echo $data['ultimonome']; ?>" />
                <?php if ($error['ultimonome']) echo '<p>', $error['ultimonome']; ?>
            <p>
            <p>
                <label>Endereco: </label>
                <input type="text" name="data[endereco]" value="<?php echo $data['endereco']; ?>" />
                <?php if ($error['endereco']) echo '<p>', $error['endereco']; ?>
            <p>
            <p>
                <label>Cidade: </label>
                <input type="text" name="data[cidade]" value="<?php echo $data['cidade']; ?>" />
                <?php if ($error['cidade']) echo '<p>', $error['cidade']; ?>
            <p>
            <p>
                            <label>Provincia: </label>
                <input type="text" name="data[provincia]" value="<?php echo $data['provincia']; ?>" />
                <?php if ($error['provincia']) echo '<p>', $error['provincia']; ?>
            <p>
            <p>
                <label>Codigo Postal: </label>
                <input type="text" name="data[codigopostal]" value="<?php echo $data['codigopostal']; ?>" />
                <?php if ($error['codigopostal']) echo '<p>', $error['codigopostal']; ?>
            <p>
            <p>
                            <label>Pais: </label>
                <input type="text" name="data[pais]" value="<?php echo $data['pais']; ?>" />
                <?php if ($error['pais']) echo '<p>', $error['pais']; ?>
            <p>
            <p>
                <label>Telefone: </label>
                <input type="text" name="data[telefone]" value="<?php echo $data['telefone']; ?>" />
                <?php if ($error['telefone']) echo '<p>', $error['telefone']; ?>
            <p>
            <p>
                <input type="reset" name="data[clear]" value="Clear" class="button"/>
                <input type="submit" name="data[submit]" value="Submit" class="button marL10"/>
            <p>
        </form>
    </div><!-- product-list -->
</div>

我的用户表是

users table structure

但它显示如下: users table after the INSERT command

请帮忙,我绝望了。

1 个答案:

答案 0 :(得分:0)

似乎您提出的大多数查询都非常接近。我会用这个:
INSERT INTO `membros` (`primeironome`, `ultimonome`, `endereco`, `cidade`, `provincia`, `codigopostal`, `pais`, `telefone`, `email`) VALUES (:primeironome, :ultimonome, :endereco, :cidade, :provincia, :codigopostal, :pais, :telefone, :email);
或者这一个:
INSERT INTO `membros` SET `primeironome` = :primeironome, `ultimonome` = :ultimonome, `endereco` = :endereco, `cidade` = :cidade, `provincia` = :provincia, `codigopostal` = :codigopostal, `pais` = :pais, `telefone` = :telefone, `email` = :email;

使用它调用prepare(),然后确保传递给execute()的数组看起来像这样(用实际值替换[...]):
["primeironome" => [...], "ultimonome" => [...], "endereco" => [...], "cidade" => [...], "provincia" => [...], "codigopostal" => [...], "pais" => [...], "telefone" => [...], "email" => [...] ]

这应该工作得很好。如果它没有,则问题出在列名(检查拼写)或您传递给函数的实际值中(例如,传递数组不会很顺利)。

编辑 - 在评论中这样做很尴尬

好的,所以我现在正试图重现你的情况。我创建了一个包含以下CREATE代码的表:

CREATE TABLE `membros` (
    `membro_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `primeironome` VARCHAR(15) NOT NULL,
    `ultimonome` VARCHAR(15) NOT NULL,
    `endereco` VARCHAR(256) NOT NULL,
    `cidade` VARCHAR(64) NOT NULL,
    `provincia` CHAR(32) NULL DEFAULT NULL,
    `codigopostal` CHAR(10) NOT NULL,
    `pais` CHAR(3) NOT NULL,
    `datanascimento` DATE NULL DEFAULT NULL,
    `telefone` CHAR(16) NULL DEFAULT NULL,
    `balanco` DECIMAL(10,2) UNSIGNED NULL DEFAULT NULL,
    `email` VARCHAR(250) NOT NULL,
    `password` VARCHAR(16) NULL DEFAULT NULL,
    PRIMARY KEY (`membro_id`)
)
ENGINE=MyISAM;

首先注意一些注意事项:我认为名字和姓氏的列太短了(只有15个字符,我个人首先使用30个字符,最后使用50个字符)。此外,从您的password列只有16个字符,我推断出两件事:您的最大密码长度太短(这使得暴力攻击变得更容易),并且您的密码保存完好无损。 永远不要存放密码!

继续讨论你的实际问题:我确实执行了以下代码,它确实有效。您所要做的就是确保最终传递给查询的$data数组看起来相同(使用不同的值,但键具有完全相同的)。

//I assume you have a working database connection, mine is the variable $connection
$data = ["primeironome" => "mi nome", "ultimonome" => "mi ultimo nome", "endereco" => "test 12345", "cidade" => "rio de janeiro", "provincia" => "no se", "codigopostal" => "12345 abc", "pais" => "BRA", "telefone" => "0123456789", "email" => "test@example.com"];
$prepStatement = $connection->prepare("INSERT INTO `membros` (`primeironome`, `ultimonome`, `endereco`, `cidade`, `provincia`, `codigopostal`, `pais`, `telefone`, `email`) VALUES (:primeironome, :ultimonome, :endereco, :cidade, :provincia, :codigopostal, :pais, :telefone, :email);");
$prepStatement->execute($data);

我还注意到您的原始代码中存在一个错误:您的$data变量在获取时已经是一个数组,但是您将其作为$stmt->execute(array($data));传递。这应该是$stmt->execute($data);。 您之后还尝试fetch()结果:INSERT查询不返回结果,因此无需提取任何内容。如果您想知道它是否成功,请执行以下操作:

$status = $stmt->execute($data);

$status变量将包含TRUEFALSENULL

最后一点,这是我之前建议你的foreach循环解析帖子数据的内容:

//make the default data array (with empty values, this is just to make sure the keys exist)
$data = ["primeironome" => "", "ultimonome" => "", "endereco" => "", "cidade" => "", "provincia" => "", "codigopostal" => "", "pais" => "", "telefone" => "", "email" => ""];

//REMOVE THIS LINE ->
//$data = $_POST['data'];

//now add your values from the $_POST array
foreach ($data as $key => $value)
{
    if (isset($_POST[$key]))
    {
        $data[$key] = strip_tags($_POST[$key]);
    }
}

现在,您将您在$ data数组中定义的键放在文件的顶部,而$_POST中没有的键仍然是您在那里设置的默认值。