2016-06-07 2 views
2

У меня возникла проблема с попыткой заставить PHP-скрипт работать на моем сайте, где я могу добавлять новые предметы в свой интернет-магазин.PHP MySQLi проблема с подготовленными операторами, вызывающими ошибку

Фрагмент кода, у меня возникли проблемы с это:

$error = ''; 
$success = ''; 

if(isset($_POST['submit'])) 
{ 
    define("MAX_SIZE", "4096"); 

    $errors=0; 

    $name = $_POST['name']; 
    $price = $_POST['price']; 
    $desc = filter_var($_POST['desc'], FILTER_SANITIZE_STRING); 
    $image = $_FILES['image']['name']; 
    $uploadedfile = $_FILES['image']['tmp_name']; 

    if($image) 
    { 
     $filename = stripslashes($_FILES['image']['name']); 
     $extension = getExtension($filename); 
     $extension = strtolower($extension); 
     if(($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
     { 
      $error .= '<p class="error">The file must be one of the following file types(jpg|jpeg|png|gif)</p>'; 
      $errors=1; 
     } 
     else 
     { 
      $size=filesize($_FILES['image']['tmp_name']); 

      if($size > MAX_SIZE*1024) 
      { 
       $error .= '<p class="error">The file cannot exceed 4MB in size.</p>'; 
       $errors=1; 
      } 

      if($extension=="jpg" || $extension=="jpeg") 
      { 
       $uploadedfile = $_FILES['image']['tmp_name']; 
       $src = imagecreatefromjpeg($uploadedfile); 
      } 
      else if($extension=="png") 
      { 
       $uploadedfile = $_FILES['image']['tmp_name']; 
       $src = imagecreatefrompng($uploadedfile); 
      } 
      else 
      { 
       $src = imagecreatefromgif($uploadedfile); 
      } 

      list($width,$height)=getimagesize($uploadedfile); 

      $newwidth=128; 
      $newheight=128; 
      $tmp=imagecreatetruecolor($newwidth,$newheight); 

      imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); 

      $filename = "../store/images/" . $_FILES['image']['name']; 

      imagejpeg($tmp,$filename,100); 

      $fname = $_FILES['image']['name']; 

      imagedestroy($src); 
      imagedestroy($tmp); 
     } 
    } 

    if($name == '') 
    { 
     $error .= '<p class="error">You must enter a name for the product.</p>'; 
    } 

    if(!preg_match('/^[a-zA-Z\s]+$/', $name)) 
    { 
     $error .= '<p class="error">The product name can only contain letters and spaces.</p>'; 
    } 

    if($_POST['type'] == 'KIT') 
    { 
     $type = 'KIT'; 
    } 
    else if($_POST['type'] == 'VIP') 
    { 
     $type = 'VIP'; 
    } 
    else if($_POST['type'] == 'OTHER') 
    { 
     $type = 'OTHER'; 
    } 
    else 
    { 
     $error .= '<p class="error">You must select a valid type for the product.</p>'; 
    } 

    if($price == '') 
    { 
     $error .= '<p class="error">You must enter a price for the product.</p>'; 
    } 

    if(!preg_match('/^\d+(:?[.]\d{2})$/', $price)) 
    { 
     $error .= '<p class="error">You must enter a valid price for the product.</p>'; 
    } 

    if($desc == '') 
    { 
     $error .= '<p class="error">You must enter a description for the product.</p>'; 
    } 

    $stmt = $db->prepare("SELECT * FROM products WHERE name = ?"); 
    if($stmt) 
    { 
     $stmt->bind_param('s',$name); 
     $stmt->execute(); 

     if($stmt->num_rows > 0) 
     { 
      $error .= '<p class="error">This product already exists. Please choose a different name.</p>'; 
     } 
    } 
    else 
    { 
     $error .= '<p class="error">An error occurred at line 135. Please contact the site administrator.</p>'; 
    } 

    if(empty($error) && !$errors) 
    { 
     $stmt = $db->prepare("INSERT INTO products (name, image, price, prod_desc, type) VALUES (?, ?, ?, ?, ?)"); 

     if($stmt) 
     { 
      $stmt->bind_param('sssss', $name, $fname, $price, $desc, $type); 

      if($stmt->execute()) 
      { 
       $success .= '<p class="success">Product added successfully.</p>'; 
      } 
      else 
      { 
       $error .= '<p class="error">An error occured at line 158. Please contact the site administrator.</p>'; 
      } 
     } 
     else 
     { 
      $error .= '<p class="error">An error occured at line 154. Please contact the site administrator.</p>'; 
     } 
    } 
} 

раздел У меня возникли проблемы с является, если ($ STMT) блокировать сразу после того, если (пусто ($ ошибка) & & ! & ошибок).

Согласно каждой проверке синтаксиса, которую я использовал как для самого PHP, так и для запроса на вставку MySQL, все они не сообщают об ошибках. Но он продолжает выплевывать ошибку для строки 154, и я не могу понять, почему. Я уже проверил, что переменные хранятся должным образом из формы, повторяя их, и я также проверил, что столбцы таблицы mysql существуют и написаны правильно.

Это начинает отвлекать меня от орехов, и когда я попытался отследить ошибку mysql, используя ошибку $ stmt-> error или $ db->, она вернулась в прошлое, без каких-либо ошибок.

Единственный результат я когда-либо получал, когда я сделал mysqli_errno ($ дб), возвращающей 0.

Каждый знает, что не так с этим кодом, или почему он не работает?

HTML Markup для формы:

<div id="form"> 
<form action="" method="post" enctype="multipart/form-data"> 
<table> 
<th colspan="2">Add to Store</th> 
<tr> 
<td colspan="2"> 
<p>Please use the form below to add items to the store.</p> 
<?php 

if($error) 
{ 
    echo $error; 
} 

if($success) 
{ 
    echo $success; 
} 

?> 
<hr> 
<tr> 
<td><label for="name">Product Name:</label></td> 
<td><input type="text" name="name" id="name" value="<?php if(isset($name)) { echo $name; } else { echo ''; } ?>" /></td> 
</tr> 

<tr> 
<td><label for="price">Product Price:</label></td> 
<td><input type="text" name="price" id="price" size="6" maxlength="6" value="<?php if(isset($price)) { echo $price; } else { echo ''; } ?>" /></td> 
</tr> 

<tr> 
<td><label for="image">Product Image:</label></td> 
<td><input type="file" name="image" id="image" /><br /><small>File must be 128x128 pixels, and no larger than 4MB.</small></td> 
</tr> 

<tr> 
<td><label for="type">Product Type:</label></td> 
<td> 
<select name="type"> 
<option value="VIP">VIP Package</option> 
<option value="KIT">Donator Kit</option> 
<option value="OTHER">Other</option> 
</select> 
</td> 
</tr> 

<tr> 
<td colspan="2"><label for="desc">Product Description:</label></td> 
</tr> 
<tr> 
<td colspan="2"><textarea name="desc" style="width: 500px; height:250px;"><?php if(isset($desc)) { echo $desc; } ?></textarea></td> 
</tr> 

<tr> 
<td colspan="2"><input type="submit" name="submit" id="submit" value="Add Product" /></td> 
</tr> 

</table> 
</form> 
</div> 
+0

Какая ошибка это выплевывание? Что такое строка 154? –

+0

Строка 154 относится к блоку if ($ stmt) непосредственно после следующей строки внизу кода: $ stmt = $ db-> prepare ("INSERT INTO products (имя, изображение, цена, prod_desc, type) VALUES (& Alpha;, & alpha;, & alpha;, & alpha;, & alpha;) "); нет погрешность выливание, кроме того это сообщение. – Bryan

+0

Проверьте свои журналы ошибок для * актуальной * ошибки. С '$ stmt' что-то не так, что указывает на проблему с вашим запросом. –

ответ

1

Так после долгих головной боли, мне удалось найти обходной путь.

Источником проблемы существовали здесь:

$stmt = $db->prepare("SELECT * FROM products WHERE name = ?"); 
    if($stmt) 
    { 
     $stmt->bind_param('s',$name); 
     $stmt->execute(); 

     if($stmt->num_rows > 0) 
     { 
      $error .= '<p class="error">This product already exists. Please choose a different name.</p>'; 
     } 
    } 
    else 
    { 
     $error .= '<p class="error">An error occurred at line 135. Please contact the site administrator.</p>'; 
    } 

после изменения этого на следующее:

$sql = "SELECT * FROM products WHERE name = '".$name."' LIMIT 1"; 
    $result = $db->query($sql); 

    if(is_object($result) && $result->num_rows == 1) 
    { 
     $error .= '<p class="error">This product already exists. Please choose a different name.</p>'; 
    } 

Все довольны, и работает без проблем в настоящее время. Все еще не уверен, почему исходный код не работал, но он работает сейчас. Спасибо за помощь.

+0

Отбрасывание подготовленного заявления заставило эту работу? Это действительно противоречит интуиции. –

+0

Да, не знаю, почему подготовленное заявление не сработало, но не подготовленное. – Bryan

Смежные вопросы