2015-04-02 7 views
0

Я пытаюсь вставить новую запись в MySQL Db, но подготовленный метод выражения, который я использую, не работает. Я использую запрос, который нашел here, и похоже, что он должен работать отлично, но это не так. У меня нет ошибок.PDO INSERT INTO не работает

Вот моя форма:

<form name="registration" action="su-sql.php" method="post"> 
    <ul> 

     <fieldset> 
      <li><label for="email">Email</label></li> 
      <li><input type="email" name="email" id="email" required="required" aria-required="true" spellcheck="false" onblur="checkEmail(this.value);" onchange="checkEmail(this.value);"/></li> 
      <li><label for="password">Password</label></li> 
      <li><input type="password" name="password" id="password" required="required" aria-required="true" spellcheck="false" onblur="checkPassword(this.value);" onchange="checkPassword(this.value);"/></li> 
      <li><label for="passconfirm">Confirm Password</label></li> 
      <li><input type="password" name="passconfirm" id="passconfirm" required="required" aria-required="true" spellcheck="false" onblur="checkPassconfirm(this.value);" onchange="checkPassconfirm(this.value);"/></li> 
     </fieldset> 

     <fieldset> 
      <li><label for="firstname">First Name</label></li> 
      <li><input type="text" name="firstname" id="firstname" required="required" aria-required="true" onblur="checkFirstname(this.value);" onchange="checkFirstname(this.value);"/></li> 
      <li><label for="lastname">Last Name</label></li> 
      <li><input type="text" name="lastname" id="lastname" required="required" aria-required="true" onblur="checkLastname(this.value);" onchange="checkLastname(this.value);"/></li> 
      <li><label for="country">Country</label></li> 
      <li> 
       <select name="country" id="country" required="required" aria-required="true" onblur="checkCountry(this.value);" onchange="checkCountry(this.value);"> 
        <option selected value="" class="option" id="choose">Choose your Country</option> 

        <?php 

        $countries = array('Afghanistan','Akrotiri','Albania','Algeria','American Samoa','Andorra','Angola','Anguilla','Antarctica','Antigua and Barbuda', 
         'Argentina','Armenia','Aruba','Ashmore and Cartier Islands','Australia','Austria','Azerbaijan','Bahamas, The','Bahrain','Bangladesh','Barbados', 
         'Bassas da India','Belarus','Belgium','Belize','Benin','Bermuda','Bhutan','Bolivia','Bosnia and Herzegovina','Botswana','Bouvet Island','Brazil', 
         'British Indian Ocean Territory','British Virgin Islands','Brunei','Bulgaria','Burkina Faso','Burma','Burundi','Cambodia','Cameroon','Canada', 
         'Cape Verde','Cayman Islands','Central African Republic','Chad','Chile','China','Christmas Island','Clipperton Island','Cocos (Keeling) Islands', 
         'Colombia','Comoros','Congo, Democratic Republic of the','Congo, Republic of the','Cook Islands','Coral Sea Islands','Costa Rica','Cote d\'Ivoire', 
         'Croatia','Cuba','Cyprus','Czech Republic','Denmark','Dhekelia','Djibouti','Dominica','Dominican Republic','Ecuador','Egypt','El Salvador','Equatorial Guinea', 
         'Eritrea','Estonia','Ethiopia','Europa Island','Falkland Islands (Islas Malvinas)','Faroe Islands','Fiji','Finland','France','French Guiana', 
         'French Polynesia','French Southern and Antarctic Lands','Gabon','Gambia, The','Gaza Strip','Georgia','Germany','Ghana','Gibraltar','Glorioso Islands','Greece', 
         'Greenland','Grenada','Guadeloupe','Guam','Guatemala','Guernsey','Guinea','Guinea-Bissau','Guyana','Haiti','Heard Island and McDonald Islands', 
         'Holy See (Vatican City)','Honduras','Hong Kong','Hungary','Iceland','India','Indonesia','Iran','Iraq','Ireland','Isle of Man','Israel','Italy','Jamaica', 
         'Jan Mayen','Japan','Jersey','Jordan','Juan de Nova Island','Kazakhstan','Kenya','Kiribati','Korea, North','Korea, South','Kuwait','Kyrgyzstan', 
         'Laos','Latvia','Lebanon','Lesotho','Liberia','Libya','Liechtenstein','Lithuania','Luxembourg','Macau','Macedonia','Madagascar','Malawi','Malaysia', 
         'Maldives','Mali','Malta','Marshall Islands','Martinique','Mauritania','Mauritius','Mayotte','Mexico','Micronesia, Federated States of','Moldova', 
         'Monaco','Mongolia','Montserrat','Morocco','Mozambique','Namibia','Nauru','Navassa Island','Nepal','Netherlands','Netherlands Antilles','New Caledonia', 
         'New Zealand','Nicaragua','Niger','Nigeria','Niue','Norfolk Island','Northern Mariana Islands','Norway','Oman','Pakistan','Palau','Panama','Papua New Guinea', 
         'Paracel Islands','Paraguay','Peru','Philippines','Pitcairn Islands','Poland','Portugal','Puerto Rico','Qatar','Reunion','Romania','Russia','Rwanda', 
         'Saint Helena','Saint Kitts and Nevi','Saint Lucia','Saint Pierre and Miquelon','Saint Vincent and the Grenadines','Samoa','San Marino','Sao Tome and Principe', 
         'Saudi Arabia','Senegal','Serbia and Montenegro','Seychelles','Sierra Leone','Singapore','Slovakia','Slovenia','Solomon Islands','Somalia','South Africa', 
         'South Georgia and the South Sandwich Islands','Spain','Spratly Islands','Sri Lanka','Sudan','Suriname','Svalbard','Swaziland','Sweden','Switzerland','Syria', 
         'Taiwan','Tajikistan','Tanzania','Thailand','Timor-Leste','Togo','Tokelau','Tonga','Trinidad and Tobago','Tromelin Island','Tunisia','Turkey','Turkmenistan', 
         'Turks and Caicos Islands','Tuvalu','Uganda','Ukraine','United Arab Emirates','United Kingdom','United States','Uruguay','Uzbekistan','Vanuatu','Venezuela', 
         'Vietnam','Virgin Islands','Wake Island','Wallis and Futuna','West Bank','Western Sahara','Yemen','Zambia','Zimbabwe'); 

        foreach ($countries as $country) { 
         echo '<option value="'.$country.'" class="option">'.$country.'</option>'; 
        } 

        ?> 

       </select> 
       <div class="clear"></div> 
      </li>   
      <li><label for="gender">Gender</label></li> 
      <li> 
       <input checked type="radio" name="gender" value="male" required="required" aria-required="true" onchange="checkGender(this.value);"> Male 
       <input type="radio" name="gender" value="female" required="required" aria-required="true" onchange="checkGender(this.value);"> Female 
      </li> 
      <li><input type="submit" value="Submit"/></li>  
     </fieldset> 

    </ul> 
    <div class="clear"></div> 
</form> 

А вот PHP:

error_reporting(E_ALL); 
ini_set('display_errors',1); 



$db_host = "localhost"; 
$db_user = "user"; 
$db_pass = "pass"; 
$db_name = "name"; 


$db = new PDO('mysql:host='.$db_host.';dbname='.$db_name, $db_user, $db_pass); 


do { 

    /* 
     Generate random number between min and max 
     min: 1000000000 
     max: 2147483647 
    */ 

    $uid = mt_rand(1000000001,2147483646); 

    // make sure that uid isn't already being used 

    $query = $db->prepare("SELECT * FROM `members` WHERE `uid` = :uid"); 
    $query->bindValue(":uid", $uid); 
    $query->execute(); 

    $user = $query->fetch(PDO::FETCH_ASSOC); 

} while ($user['uid'] === $uid); 




$fbid = null; 
$email = $_POST['email']; 
$password = $_POST['password']; 
$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$country = $_POST['country']; 
$gender = $_POST['gender']; 


echo $firstname.' '.$lastname.': '.$uid; 


// Using prepared statements almost eliminates the possibility of SQL Injection. 

$query = $db->prepare("INSERT INTO `members`(uid, fbid, email, password, firstname, lastname, country, gender) 
    VALUES(:uid, :fbid, :email, :password, :firstname, :lastname, :country, :gender)"); 

$query->execute(array(
    "uid" => $uid, 
    "fbid" => $fbid, 
    "email" => $email, 
    "password" => $password, 
    "firstname" => $firstname, 
    "lastname" => $lastname, 
    "country" => $country, 
    "gender" => $gender 
)); 


// get the user's DB entry 

$query = $db->prepare("SELECT * FROM `members` WHERE `uid` = :uid"); 
$query->bindValue(":uid", $uid); 
$query->execute(); 

// Retrieve the results from the database 
$user = $query->fetch(PDO::FETCH_ASSOC); 

if($user) { 
    echo '<br/>'.$user['firstname'].' '.$user['lastname'].': '.$user['uid']; 
} else { 
    echo '<br/>No User'; 
} 

При загрузке страницы, она показывает имя и фамилию пользователя и их вновь сгенерированный номер ID все на первая линия. Во второй строке указано «Нет пользователя».

Пожалуйста, не забывайте, что пароль не защищен. Я просто делаю это.

Может ли кто-нибудь увидеть, где проблема?

+0

Трудно сказать, не зная, как выглядит HTML-форма. –

+0

@ Fred-ii- добавлен код для HTML-формы –

+0

Ну, все ваши элементы формы названы; это хорошо. Я вижу JS, связанный с ними, поэтому, если вы используете Ajax, это может быть другой возможной причиной и что значения '{username: username}' могут не совпадать; сложно сказать. Если все массивы POST откликнутся, мы можем оставить это из уравнения. Остается только добавить '$ db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);' сразу после открытия соединения, чтобы узнать, является ли это проблемой, связанной с БД. –

ответ

1

Как @ предложил Фред-ии, я добавил следующую строку после подключения к БД:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Когда я сделал это, я получил следующее сообщение об ошибке:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'fbid' cannot be null' in /home/ourfilmclub/public_html/build/su-sql.php:68 Stack trace: #0 /home/ourfilmclub/public_html/build/su-sql.php(68): PDOStatement->execute(Array) #1 {main} thrown in /home/ourfilmclub/public_html/build/su-sql.php on line 68 

В основном, колонка fbid не может быть null. Я заменяю null на '', и теперь все работает чудесно. Kudos @ Fred-ii-

+0

А ... как ни странно; мысль о том, что «нуль» раньше входила в мой разум и собиралась упомянуть, может ли ваша колонка принимать нулевые значения. Рад, что он разрешился, * ура! * –