2015-07-06 5 views
-6

После выполнения этого сценария, я получаю эту ошибку:Ошибка при запуске SQL синтаксиса

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in ... On this line : if (mysqli_num_rows($result3) > 0) {

Любой идею, что случилось?

if (isset($_POST['submit'])) 
    { 
     $sql = "SHOW COLUMNS FROM Work"; 
     $result = mysqli_query($con,$sql); 
     while($row = mysqli_fetch_array($result)){ 
        $tempname = $row['Field']; 
        $sql2 = "UPDATE Work SET `".$row['Field']."`= '$_POST[$tempname]' WHERE ID='".$_GET["id"]."' AND Date='".$_GET["date"]."'"; 

        $result2 = mysqli_query($con,$sql2); 
        if ($con->query($sql2) === TRUE) { 
        } else { 
         echo "Error: " . $sql2 . "<br>" . $con->error; 
        } 
     } 
     $sql3 = "SELECT * FROM Work WHERE ID='".$_GET["id"]."' AND (".$row['Field']." NOT LIKE '".$_POST[$tempname]."')"; 
+3

Mmmm ... Bobby Tables https://xkcd.com/327/ – Ben

+6

ВЫ ДОЛЖНЫ начать использовать подготовленные операторы НЕМЕДЛЕННО. Это не шутка. –

+2

Вопрос спрашивает о 'if (mysqli_num_rows ($ result3)' - но этот код не отображается в источнике? @mikeb, вам может потребоваться изменить этот вопрос, чтобы исправить это. – unrivaledcreations

ответ

4

Ошибка:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given

почти всегда потому, что вы пытались выполнить запрос, и это не удалось по какой-то причине, но вы продолжали слепо в любом случае.

При неудаче mysqli_querywill return false, а не mysqli_result и, если затем попытаться использовать это булево false значения в чем-то вроде mysqli_num_rows, это точно ошибки вы увидите.

Как первый пункт, вы должны всегда проверить возвращаемое значение функций, которые могут потерпеть неудачу, это просто хорошая практика. Продолжать слепо и надеяться на лучшее не на самом деле способ создать надежный код.


Сказав это, вы затем перейти к почему запрос не удалось. Большая часть проблем SQL становится очевидной, если вы только распечатываете запрос, прежде чем пытаться его выполнить. Похоже, вы в конечном итоге сделать это, так как один из ваших комментариев говорится, что ваш запрос:

SELECT * FROM Workhours WHERE AFNumber='AF1475' AND (NOT LIKE '') 

Это не допустимый оператор SQL, поэтому проблема.Теперь, несмотря на то, что, как представляется, используя другое имя таблицы (более ранние редактирования Вашего вопроса сделал имеют соответствующее имя таблицы), это близко соответствует вашей $sql3 переменной :

$sql3 = "SELECT * FROM Work WHERE ID='".$_GET["id"]."' AND (".$row['Field']." NOT LIKE '".$_POST[$tempname]."')"; 

Следовательно что ни $row['Field'], ни $_POST[$tempname] фактически не установлены ни на что.

Это, где вам нужно сосредоточить свои усилия, чтобы выяснить, почему именно они не множество.

Для начала кажется нецелесообразным использовать $row[anything]после цикл обработки строк завершен. Вполне возможно, что вам нужно переместить этот код в в пределах цикла, чтобы заставить его работать, но без дополнительной информации и контекста это действительно просто гипотеза (хотя и образованная гипотеза).


Если это не право запроса (я только заметил, что это также использует ID вместо AFNumber), то проблема заключается в другом, кроме кода вы показали. Однако метод, используемый для поиска проблемы, останется прежним: найдите проблемный запрос, распечатайте его перед исполнением, а затем выясните, почему он искажен.

+0

Кроме того, существует ссылка на '$ row' * outside * цикл while, который определяет его. (Строка '$ sql3 =" ... 'сразу после цикла while.) Также существует комбинация' POST' и 'GET', а также сочетание процедурных стилей и функций стиля объекта' mysqli_query' и '$ con> error'. – spencer7593

+0

@paxidiablo я уже исправил его, но спасибо за ваши усилия! – mikeb

2

Ошибка SQL Statement,

Вы используете зарезервированное слово как имя столбца, оно должно быть заключено с задним клеща следующим

`Date` 

$sql2 = "UPDATE Workhours SET `".$row['Field']."`= '$_POST[$tempname]' WHERE AFNumber='".$_GET["af"]."' AND `Date`='".$_GET["date"]."'"; 
+1

Проблема в sql3. –

+1

@ user1844933 нет не действительно, проблема остается – mikeb

+1

echo $ sql3 и запускается непосредственно в базе данных – user1844933

0

Вы баловаться с одинарными кавычками и двойной цитирует и пропускает их во многих местах. Кроме того, как я уже указывал в комментариях, его трудно отлаживать, гадая. Вы должны повторить ошибку mysql, которую вы получаете при запуске запроса. Что вы эхо к настоящему времени, так это то, что после запуска запроса вы не получите массив результатов: но это вызвано тем, что запрос имеет проблему. Много раз это просто вопрос чтения ошибки, чтобы понять, что происходит не так. Наконец, вы можете получить это и потому, что у вас нет какой-либо ошибки, но вы просто извлечение пустого набора результатов из запроса (запись не удовлетворяет запрос) Изменить этот запрос к этому:

$sql2 = "UPDATE Workhours SET `{$row['Field']}` = '{$_POST[$tempname]}' 
WHERE AFNumber='{$_GET['af']}' AND Date='{$_GET['date']}'"; 

За $ SQL3:

$sql3 = "SELECT * FROM Workhours WHERE AFNumber='{$_GET['af']}' 
AND (`{$row['Field']}` NOT LIKE '%{$_POST[$tempname]}%')"; 

Примечание я не получаю в деталях многих проблем, ваш фактический код имеет: во-первых, что открыт для SQL инъекции, как многие уже указывал: взять немного чтобы посмотреть, какие подготовленные заявления есть. Также рассмотрите переход к PDO вместо mysqli.

+0

дорогой, проблема остается – mikeb

+0

Вы уже проверили мое обновление? Можете ли вы попытаться выяснить, какая ошибка mysql возвращается во время выполнения этого запроса (основная часть отладки)? –

+0

И разве вы не видите ошибку? Я только что очистил ваш код, но проблема в этом уже есть! '$ row ['Field']' и '$ _POST [$ tempname]' не установлены: запрос никогда не будет запущен! –

0

ваш метод кодирования нуждается много улучшений,

и проблема явно в Get и Post.

В этом конкретном случае я бы порекомендовал, используя $_REQUEST вместо всего сообщения и получить. поэтому ваш запрос получает все параметры, и ваш код становится идеальным.

0

может вы могли бы попробовать эту строку:

while($row = $result->fetch_array(MYSQLI_ASSOC)){ 
0

Что я могу видеть просто обзор, наконец отредактированный кода заключается в следующем:

if (isset($_POST['submit'])) 
    { 
     $sql = "SHOW COLUMNS FROM Work"; 

     // ====> This new var is here to allow us retrieving 
     // the last row after the while loop, because the 
     // "$row" var will be equal to false at the end. 
     $lastRow = null; 

     $result = mysqli_query($con,$sql); 
     while($row = mysqli_fetch_array($result)){ 
      $tempname = $row['Field']; 
      $sql2 = "UPDATE Work SET `".$row['Field']."`= '$_POST[$tempname]' WHERE ID='".$_GET["id"]."' AND Date='".$_GET["date"]."'"; 
// ====> The previous line should be replaced with this: 
      $sql2 = 'UPDATE Work SET `'.$row['Field'].'`= "'.htmlspecialchars($_POST[$tempname], ENT_QUOTES).'" WHERE ID="'.((int) $_GET["id"]).'" AND Date="'.htmlspecialchars($_GET["date"], ENT_QUOTES).'"'; 


      $result2 = mysqli_query($con,$sql2); 
      if ($con->query($sql2) === TRUE) { 
       $lastRow = $row; 
      } else { 
       echo "Error: " . $sql2 . "<br>" . $con->error; 
      } 
     } 
     $sql3 = "SELECT * FROM Work WHERE ID='".$_GET["id"]."' AND (".$row['Field']." NOT LIKE '".$_POST[$tempname]."')"; 
// ====> The previous line should be replaced with this: 
     if (isset($_POST[$tempname]) && !empty($_POST[$tempname]) && $lastRow) { 
      $sql3 = 'SELECT * FROM Work WHERE ID="'.((int)$_GET['id']).'" AND (`'.$lastRow['Field'].'` NOT LIKE "'.htmlspecialchars($_POST[$tempname], ENT_QUOTES).'")'; 
     } else { 
      // Show some error here 
     } 

Главным образом, я переработан немного ваши запросы SQL для : * Стандартизируйте одиночные/двойные кавычки * Используйте «htmlspecialchars», чтобы избежать некоторых инъекций с переменными POST и GET.

Это для увиденного кода.

Теперь, в остальном, вам не хватает многих вещей в ваших методах кодирования.

  1. Во-первых, вам нужно добавить много кода безопасности в свой код. Здесь вы извлекаете параметр запроса $_GET['id'] и некоторые $_POST vars. Вы ДОЛЖНЫ проверять их, чтобы избежать любой инъекции SQL.
  2. Этот рабочий процесс кажется неправильным: вы обновляете поля, перечисленные в данных POST. Без моих изменений любой может сделать запрос на ваш сайт следующим образом: /?id=5&date=anyDate, а в POST данные могут отправить это: Field="" WHERE 1 --. Классическая инъекция, вероятно, сломает ваше приложение.
  3. Вы должны пересмотреть использование mysqli и использовать вместо этого PDO, даже если оба могут обрабатывать подготовленные. Это просто мнение.
  4. Вы должны использовать стандарты в пути кодирования, изменить названия вара для более «поясняющего» Варса и т.д. Изменение $sql, $sql2 и $sql3 для $sqlColumns, $sqlUpdate и $sqlLastCheck будет более многословным, например. Кроме того, вы должны использовать один уникальный стандарт для цитирования элементов в ваших строках. Использование одинарных кавычек для каждой строки PHP и двойных кавычек для SQL-запросов - это очень распространенная практика, и я рекомендую вам переключиться на этот метод.
  5. Вы должны использовать некоторые умные IDE, такие как SublimeText, PhpStorm или любую другую среду IDE, которая подходит для PHP-кодирования. Самые мощные, такие как PhpStorm, будут информировать вас о многих ошибках даже перед выполнением кода. Другие, такие как SublimeText, просто разбивают раскраску синтаксиса, когда вы делаете некоторые ошибки, например, неправильные кавычки.

Надеюсь, что это поможет.

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