728x90
Why would the following code produce the above error the 3rd itteration?

while ($row_comp = $comp->fetch_array())
{
      $comp_count++;
      $comp_id = $row_comp['TID'];            
      $SqlString = "select * from pers where TID = \"$comp_id\"";
      echo "str = ".$SqlString."<br>";
      $pers = $conn->query($SqlString);
      while ($row_pers = $pers->fetch_array())
      {

The screen output looks like this:
str = select * from pers where TID = "10019706"
str = select * from pers where TID = "10019771"
str = select * from pers where TID = "10019779"

Fatal error: Call to a member function fetch_array() on a non-object in /home/langsyst/public_html/Lansco/Fix_Data_2A.php on line 58

Line 58 is the 2nd while
breeze351
Asked: 
breeze351
1 Solution
breeze351Author Commented: 
I forgot to add that I checked the 3rd sql statement and it does work.
Kim WalkerWeb Programmer/TechnicianCommented: 
The error means that $pers does not contain a query result possibly due to a problem with the db connection $conn. This could be a scope issue. Is the code you posted part of a function and if so, is the variable $conn defined within that same function?

Otherwise, we have another error to deal with and we need to determine what that is. Do you have error reporting turned on? If it is turned on and you're not seeing an error, please replace your code with the following and take note of the additions I've added for exposing the error. My first change is on line 7 and then I've added code after the end of the second while loop.
while ($row_comp = $comp->fetch_array())
{
      $comp_count++;
      $comp_id = $row_comp['TID'];            
      $SqlString = "select * from pers where TID = \"$comp_id\"";
      echo "str = ".$SqlString."<br>";
      if ($pers = $conn->query($SqlString) ) {
	      while ($row_pers = $pers->fetch_array()) {
	      	...
	      }
	  } else {
	  	if ($conn->error) {
	  		echo "{$conn->error}<br>SQL = $SqlString";
	  	} else {
	  		echo '$conn is a(n) '. gettype($conn);
	  	}
	  }
}

 Open in new window

Dave BaldwinFixer of ProblemsCommented: 
The usual reason is that the query failed.
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

breeze351Author Commented: 
Kim
How do I turn on the error reporting
breeze351Author Commented: 
Kim 
This is weird?!?!?!
I modified the code per your example.  I don't get an error message, however, if I keep refreshing the program, it will give me one more record before it craps out!
Kim WalkerWeb Programmer/TechnicianCommented: 
OK. This suggests that your first query is returning a TID value that doesn't exist in the pers table. In other words, the outer loop doesn't always have the right conditions for the inner loop.

To turn on error reporting, place these two lines at the beginning of your PHP page.
error_reporting(E_ALL);
ini_set('display_errors','on');

 Open in new window

breeze351Author Commented: 
I still don't get an error message other the "Fatal error....."
And again, it keeps giving me one more record before it fails.

I've attached the code.  It's small, I'm just trying to clean up some garbage data.
Thought this would be a piece of cake, after all how hard could it be!
Fix_Data_2A.php
Kim WalkerWeb Programmer/TechnicianCommented: 
Is the fatal error still on the inner while loop (line 61)?
Kim WalkerWeb Programmer/TechnicianCommented: 
One more modification (see lines 13-14, 22-24):
$comp_count = 0;
$per_count = 0;		
$SqlString = "select * from comp where ALFA = \"    \" and COMPANY = \"    \"";
$comp = $conn->query($SqlString);
while ($row_comp = $comp->fetch_array())
{
	$comp_count++;
	$comp_id = $row_comp['TID'];		
	$SqlString = "select * from pers where TID = \"$comp_id\"";
	echo "str = ".$SqlString."<br>";
	if ($pers = $conn->query($SqlString))
	{
		if ($pers->num_rows > 0)
		{
			while ($row_pers = $pers->fetch_array())
			{
				$pers_id = $row_pers['PNID'];
				$SqlString = "delete from pers where TID = '$comp_id' and PNID = '$pers_id'";
				$pers = $conn->query($SqlString);
				$per_count++;
			}
		} else {
			echo "<p>No records found for query $SqlString</p>\n";
		}
	}
	else 
	{
  		if ($conn->error) 
		{
  			echo "{$conn->error}<br>SQL = $SqlString";
	  	} 
		else 
		{
  			echo '$conn is a(n) '. gettype($conn);
  		}
	}
}

 Open in new window

breeze351Author Commented: 
No joy!
I didn't think it would work because it keeps blowing up on the while statement.
Try this yourself (I'm not worried about the data, I have backups and it's really not current).

Go to:
1: http://langsystems.net/Lansco/
(you need to do this for the session vars)
2: http://langsystems.net/Lansco/Fix_Data_2A.php

Look at the last "TID"# in the query, then refresh the page.  You'll get the next record.

There are only 234 records that match the 1st while loop.  Do I have to hit refresh 234 times? :)
Kim WalkerWeb Programmer/TechnicianCommented: 
AHAH! So the while loop iterates once then fails. It is because the while loop is attempting to read another record from the $pers result but the $pers result is being overwritten within the while loop. Change this
				$SqlString = "delete from pers where TID = '$comp_id' and PNID = '$pers_id'";
				$pers = $conn->query($SqlString);

 Open in new window

to
				$SqlString = "delete from pers where TID = '$comp_id' and PNID = '$pers_id'";
				$conn->query($SqlString);

 Open in new window

There is no need to store the results of the delete into a variable unless you need to view results such as affected_rows. If you still want to store those results, store them in a new variable instead of reusing $pers.
breeze351Author Commented: 
Thank you, Thank you!!!!!!!!!!!!!!

I just copied the $conn->query statement from code up above.  I knew how to delete the record but sometimes you can't see something so stupid.

Thank you again.
Glenn


'WEB > jQuery' 카테고리의 다른 글

PHP array_push  (0) 2018.01.14
Fatal error: Call to a member function query() on null  (0) 2018.01.14
달력 - 날짜입력기(Date Picker)  (0) 2018.01.14
javascript comma and uncomma  (0) 2018.01.14
[jQuery] following sidebar  (0) 2018.01.14
728x90
자바스크립트 날짜입력기입니다.
각종 날짜입력 폼에 타이핑 대신 사용하면 됩니다.
원래는 우체국에서 쓰던 팝업소스인데 레이어 스타일로 변경하였습니다.

테스트 :
IE8, 파이어폭스8, 크롬15, 오페라11, 사파리5

&lt;script language="JavaScript" src="date_picker.js"&gt;&lt;/script&gt; &lt;input type="text" name="target_date"&gt; &lt;input type="button" value="달력보기" onClick="datePicker(event,'target_date')"&gt; &lt;br&gt; &lt;input type="text" name="target_date"&gt; &lt;input type="button" value="달력보기" onClick="datePicker(event,'target_date',1)"&gt; 동일한 name의 타겟인 경우 세번째 인자의 키값으로 구분합니다. 세번째 인자가 생략되면 기본값은 0입니다.   
 

date_picker.js





728x90


I am running a PHP script, and keep getting errors like:

Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php on line 10

Notice: Undefined index: my_index C:\wamp\www\mypath\index.php on line 11

Line 10 and 11 looks like this:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

What do these errors mean?

Why do they appear all of a sudden? I used to use this script for years and I've never had any problem.

What do I need to do to fix them?

This is a General Reference question for people to link to as duplicate, instead of having to explain the issue over and over again. I feel this is necessary because most real-world answers on this issue are very specific.

Related Meta discussion:

shareimprove this question
6 
2 
the variable might not have been initialized. Are you initializing the variable from a post or get or any array? If that's the case you might not have an field in that array. That your accessing. – ASK Dec 15 '15 at 13:12
1 
@ChrisJJ, Robbie's answer explains this very well. – Leith Nov 24 '16 at 7:29
3 
@Pekka웃 - I noticed the edit adding the "and "Notice: Undefined offset"" - Wouldn't it make more sense using "PHP: “Undefined variable”, “Undefined index”, “Undefined offset” notices" (even take out the PHP, since it is tagged as "php". Plus, the URL gets cut off at and-notice-undef, just a suggestion so that the URL doesn't get cut off. Maybe even removing the (too many) quotes. Or PHP: “Undefined variable/index/offset” notices – Funk Forty Niner Jan 20 '17 at 15:24 
2 
@Fred I guess an argument can be made for both variations. THere's a chance that newbies will enter the entire line, including the "Notice:" into their search query, which I'm sure is the main traffic generator for this question. If the messages are there in full, that's likely to improve visibility in search engines – Pekka 웃 Jan 20 '17 at 15:34 
up vote783down voteaccepted

Notice: Undefined variable

From the vast wisdom of the PHP Manual:

Relying on the default value of an uninitialized variable is problematic in the case of including one file into another which uses the same variable name. It is also a major security risk with register_globals turned on. E_NOTICE level error is issued in case of working with uninitialized variables, however not in the case of appending elements to the uninitialized array. isset()language construct can be used to detect if a variable has been already initialized. Additionally and more ideal is the solution of empty() since it does not generate a warning or error message if the variable is not initialized.

From PHP documentation:

No warning is generated if the variable does not exist. That means empty() is essentially the concise equivalent to !isset($var) || $var == false.

This means that you could use only empty() to determine if the variable is set, and in addition it checks the variable against the following, 0,"",null.

Example:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

Test the above snippet in the 3v4l.org online PHP editor

Although PHP does not require a variable declaration, it does recommend it in order to avoid some security vulnerabilities or bugs where one would forget to give a value to a variable that will be used later in the script. What PHP does in the case of undeclared variables is issue a very low level error, E_NOTICE, one that is not even reported by default, but the Manual advises to allow during development.

Ways to deal with the issue:

  1. Recommended: Declare your variables, for example when you try to append a string to an undefined variable. Or use isset() / !empty() to check if they are declared before referencing them, as in:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';

    This has become much cleaner as of PHP 7.0, now you can use the null coalesce operator:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  2. Set a custom error handler for E_NOTICE and redirect the messages away from the standard output (maybe to a log file):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  3. Disable E_NOTICE from reporting. A quick way to exclude just E_NOTICE is:

    error_reporting( error_reporting() & ~E_NOTICE )
  4. Suppress the error with the @ operator.

Note: It's strongly recommended to implement just point 1.

Notice: Undefined index / Undefined offset

This notice appears when you (or PHP) try to access an undefined index of an array.

Ways to deal with the issue:

  1. Check if the index exists before you access it. For this you can use isset() or array_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
  2. The language construct list() may generate this when it attempts to access an array index that does not exist:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');

Two variables are used to access two array elements, however there is only one array element, index 0, so this will generate:

Notice: Undefined offset: 1

$_POST / $_GET / $_SESSION variable

The notices above appear often when working with $_POST$_GET or $_SESSION. For $_POSTand $_GET you just have to check if the index exists or not before you use them. For $_SESSIONyou have to make sure you have the session started with session_start() and that the index also exists.

Also note that all 3 variables are superglobals. This means they need to be written in uppercase.

Related:


728x90


Functionality:

Have created a simple browsing page navigation function. This is how the function should work:

1.) When a user click a "Start" button in page1, it will navigate the user to the 2nd page

2.) 2nd page is a games page whereby, upon navigation from the 1st page, a starting countdown timer will automatically display to notify the user that the game is starting in 3 seconds. Therefore, the display upon being navigated to page 2 should have 4 separate slides, each slides will display '3', '2', '1' and 'start'.

Hence I would like to ask for help how can I incorporate the fade-in counter code into my existing <script>??

Thanks

Code:

function fadeInCounter() {
  // Define "slides" and the "state" of the animation.
  var State = "Start1";
  // Global parameters for text.
  textSize(20);
  fill(139, 69, 19);

  var draw = function() {
    // Slide 1.
    if (State === "Start1") {
      background(205, 201, 201);
      text("3", 200, 200);
      Slide1 -= 5;
      if (Slide1 <= 0) {
        background(205, 201, 201);
        State = "Start2";
      }
    }
    // Slide 2.
    if (State === "Start2") {
      background(205, 201, 201);
      text("2", 200, 200);
      Slide2 -= 5;
      if (Slide2 <= 0) {
        background(205, 201, 201);
        State = "Start3";
      }
    }
    // Slide 3.
    if (State === "Start3") {
      background(205, 201, 201);
      text("1", 200, 200);
      Slide3 -= 5;
      if (Slide3 <= 0) {
        background(205, 201, 201);
        State = "End";
      }
    }

    // Ending frame.
    if (State === "End") {
      background(205, 201, 201);
      text("Start.", 180, 200);
    }
  };

}
<div id="page2" class="img-wrapper" align="center" style=" position: relative; background-image: url(Image/Page2.png); background-repeat: no-repeat; display: none; width: 100%;height: 100%;">

  <div id="fadeinCountDown"></div>


  <canvas id="canvas" width="300" height="300">
  </canvas>
  <canvas id="Counter" width="300" height="300">
  </canvas>
  <img id="roller" style="position:relative; top:1250px;" src="Image/Roller.png">
  <img id="scroll" style="position:absolute; top: 1250px; left: 380px; overflow-y: auto;" src="Image/Scroll.png">
</div>

shareimprove this question
   
where is the js code you have tried so far? can you set up a jsfiddle with your attempt too? – Lelio Faieta Nov 12 '15 at 9:28
   
@LelioFaieta I have added in what I have tried but I have no idea how to incorporate it in\. Please help – Luke Nov 12 '15 at 9:45

Following is a fade in/out timer. JSFiddle.

Also I have taken liberty to use single div instead of multiple divs.

var count = 3;

function updateTimer(){
    if(count > 0){
        $("#content").fadeOut('slow', function(){
        	$("#content").text(count);
            $("#content").fadeIn();
            count--;
        });
        
    }
    else if(count == 0){
        $("#content").fadeOut('slow', function(){
        	$("#content").text("Start");
            $("#content").fadeIn();
            count--;
        });
        
    }
    else {
    	$("#content").fadeOut();
        clearInterval(interval);
    }
    
}

var interval = setInterval(function(){updateTimer()},2000)
#content{
    font-size:26px;
    color:red;
    text-align:center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="content"></div>


+ Recent posts